зачем нужно 8-байтовое увеличение в регистре ESP? - PullRequest
0 голосов
/ 23 ноября 2018

Недавно я увидел небольшой ассемблерный код, но мне не совсем понятна причина, по которой необходимо увеличение регистра 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.)

...