Я написал одну программу c, которая печатает ввод в вывод std.Затем я перевел его на ассемблер.Кстати, я использую синтаксис AT & T.
Это простой код C.
#include <stdio.h>
int main()
{
int c;
while ((c = getchar ()) != EOF)
{
putchar(c);
}
return 0;
}
int c является локальной переменной.
Затем я преобразовал его в сборку.language.
.file "question_1.c"
.text
.globl main
.type main, @function
//prolog
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $20, %esp // we add 20 bytes to the stack
jmp .L2
.L3:
subl $12, %esp
pushl -12(%ebp)
call putchar
addl $16, %esp
.L2:
call getchar
movl %eax, -12(%ebp)
cmpl $-1, -12(%ebp)
jne .L3
//assumption this is the epilog
movl $0, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.9.4-2ubuntu1) 4.9.4"
.section .note.GNU-stack,"",@progbits
обычно в эпилоге мы должны добавить 20, потому что в прологе мы добавили 20. Итак, кадр стека все еще там?Или я упускаю важный момент?
У меня также есть вопрос относительно основной функции.Обычно функции обычно «вызываются», но где это происходит в коде ассемблера?
Заранее спасибо.