почему использование инструкции push вместо перезаписи области памяти% esp точек вызывает неоднозначное поведение в рекурсивной процедуре - PullRequest
0 голосов
/ 03 декабря 2011

У меня есть следующий кусок сборки:

recursive:
pushl   %ebp
movl    %esp, %ebp
subl    $40, %esp
cmpl    $0, 8(%ebp)
jne .L6
movl    $0, %eax
jmp .L7
.L6:
movl    8(%ebp), %eax
movl    (%eax), %eax
movl    %eax, -12(%ebp)
movl    8(%ebp), %eax
movl    4(%eax), %eax
movl    %eax, (%esp)
call    recursive
movl    %eax, -16(%ebp)
movl    -16(%ebp), %eax
movl    -12(%ebp), %edx
leal    (%edx,%eax), %eax
.L7:
leave
ret

Когда я пытаюсь нажать% eax вместо того, чтобы перемещать его по адресу mem, где указывает esp, моя программа не работает должным образом. Я думаю, что это связано с размером стека, равным 40, потому что, когда я делаю его 36, он отлично работает с инструкцией push. Однако я не понимаю, почему это важно, потому что все адреса памяти, которые я использовал в сборке, относятся к esp и ebp.

1 Ответ

2 голосов
/ 03 декабря 2011

Либо у вас есть ошибка в другом месте, либо ваш стек недостаточно велик для обработки рекурсии. Я не вижу проблем в представленном коде.

...