Недавно я увидел небольшой ассемблерный код, но мне не совсем понятна причина, по которой необходимо увеличение регистра esp.
Пожалуйста, ознакомьтесь с кодом ниже:
.section .data
values:
.int 21,15,23,44,1,2,54,24,33,2
output:
.asciz "The number is %d\n"
.section .text
.globl _start
_start:
nop
movl %9,%edi
loop:
pushl values(,%edi,4)
pushl output
call printf
add $8,%esp
dec %edi
jnz loop
movl $1,eax
movl $0,%ebx
int $0x80
Вопрос: а) После «pushl values(,%edi,4)
» (когда %edi
равен 9) и «pushl output
», в стеке находятся «2
» и «Число %d\n
», и общее количество байтов, Iдумаю, должно быть 4 + 18 = 22 байта.Зачем добавлять 8 байт после "call printf
"?
b) Необходимо ли сделать инкремент 8 байтов в регистре esp, на какую позицию должен указывать %esp
? (Мы предполагаем, что до pushl values(,%edi,4)
... адрес esp равен N, после "2 "нажимается в стеке, позиция, на которую указывает esp, N-4.)