我写了一个单独的c程序,它将输入打印到std输出。然后我将它转换为汇编语言。顺便说一句,我正在使用AT& T语法。
这是简单的C代码。
#include <stdio.h>
int main()
{
int c;
while ((c = getchar ()) != EOF)
{
putchar(c);
}
return 0;
}
int c是一个局部变量。
然后我将它转换为汇编语言。
.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
通常在epilog中我们应该添加20,因为在prolog中我们subl 20。 那堆栈框架还在吗? 或者我错过了一个关键点?
我对主要功能也有疑问。通常,函数通常被“调用”,但它在汇编代码中会发生什么?
提前谢谢。
答案 0 :(得分:2)
在main
标签之后,leal 4(%esp), %ecx
在%ecx
中保存了四个加上堆栈指针。在例程结束时,leal -4(%ecx), %esp
将比保存的值少四个写入堆栈指针。这会直接恢复原始值,而不是通过添加减去的数量来实现。