Я пытаюсь выучить ассемблер (синтаксис Intel) путем обратного инжиниринга кода ассемблера, созданного GNU с помощью IDA.У меня очень тяжелое время, чтобы понять ссылки на адреса памяти в ассемблере, и я был бы очень признателен, если бы кто-то прокомментировал приведенный ниже код и объяснил, что на самом деле происходит.
Это следующая программа на C:
#include <stdio.h>
int main(void)
{
char *input[20];
scanf("%s", &input);
printf("%s", input);
return 0;
}
Сборка с синтаксисом Intel:
push ebp
mov ebp, esp
and esp, -16
sub esp, 96 ; char *input[20]
; scanf("%s", &input)
lea eax, [esp+16] ; move the effective address of [esp+16] into EAX
mov [esp+4], eax ; &input
mov dword ptr [esp], offset aS ; %s
call _scanf
; printf("%s", input)
lea eax, [esp+10] ; move the effective address of [esp+10] into EAX
mov [esp+4], eax ; input
mov dword ptr [esp], offset aS ; %s
call _printf
mov eax, 0
leave
ret
Вопрос 1: Почему компилятор вычел 96 из ESP, когда переменная содержит 20?Для чего нужны все дополнительные байты и как компилятор оказался на этом числе?
sub esp, 96
Вопрос 2: Почему компилятор выбрал ESP + 16?Почему нет, например, ESP + 5 или ESP + 10?
lea eax, [esp+16]
mov [esp+4], eax
Очень ценю вашу помощь.