Ошибка сегменирования

Никак не пойму, где же я сделал неправильно.

SEGMENT .data
format_str db "Result: %d\n"

SEGMENT .text
GLOBAL _start
_start:
; Ввод числовых значений аргументов M и N
mov ebx,0 ; M = 0
mov eax,2 ; N = 2
call ackermann ; Вызов процедуры вычисления функции Аккермана

; Вывод результата на экран
mov edi,$format_str ; Формат строки вывода
mov eax, esi ; Результат
xor eax, eax ; Вызов printf
call printf

; Выход из программы
mov eax,1
xor ebx, ebx
int 0x80

; Процедура вычисления функции Аккермана
ackermann:
push ebp ; Сохранение значения регистра EBP в стеке
mov esp, ebp ; Установка значения регистра EBP

mov edx,8 ; Загрузка первого аргумента N
mov ecx,12 ; Загрузка второго аргумента M

cmp edx,0 ; Сравнение N с нулем
jne .n_not_zero ; Если N != 0, переход к .n_not_zero

; База рекурсии: A(0, M) = M + 1
mov ecx, eax ; Результат = M
add eax,1 ; Результат = Результат + 1
jmp .end

.n_not_zero:
cmp ecx,0 ; Сравнение M с нулем
jne .m_not_zero ; Если M != 0, переход к .m_not_zero

; База рекурсии: A(N, 0) = A(N-1, 1)
dec edx ; N = N - 1
mov edx, (esp) 
push 1 
call ackermann 
add esp,8 
jmp .end

.m_not_zero:
dec ecx ; M = M - 1
push ecx ; Передача первого аргумента рекурсивному вызову
mov edx, (esp) ; Передача второго аргумента рекурсивному вызову
call ackermann ; Рекурсивный вызов
add esp,4 ; Очистка аргументов из стека

; Передача результата из подпрограммы родительской процедуре
mov eax, ecx ; Сохранение результата в регистре ECX

dec edx ; N = N - 1
mov ecx, eax ; Перемещение результата обратно в EAX
push edx ; Передача первого аргумента рекурсивному вызову
push ecx ; Передача второго аргумента рекурсивному вызову
call ackermann ; Рекурсивный вызов
add esp,4 ; Очистка аргументов из стека

.end:
mov ebp, esp ; Восстановление значения регистра ESP из EBP
pop ebp ; Восстановление значения регистра EBP из стека
ret ; Возврат из процедуры

; Вспомогательная функция printf для вывода результата
printf:
push ebx ; Сохранение значения регистра EBX в стеке
mov eax,0x04 ; Вызов системного вызова write
mov ebx,1 ; Файловый дескриптор stdout
mov ecx, edi ; Адрес строки формата
mov edx,16 ; Длина строки формата
int 0x80 ; Вызов системного вызова
pop ebx ; Восстановление значения регистра EBX из стека
ret ; Возврат из процедуры

Ответы (0 шт):