我正在学习汇编语言,试图理解如何从C语言代码生成汇编语言。
我创建了以下虚拟的C代码:
#include <stdio.h>
int add(int x, int y){
int result = x + y;
return result;
}
int main(int argc, char *argv[]){
int x = 1 * 10;
int y = 2 * 5;
int firstArg = x + y;
int secondArg = firstArg / 2;
int value;
value = add(firstArg, secondArg);
return value;
}
并获得了以下汇编代码
.file "first.c"
.text
.globl add
.type add, @function
add:
.LFB39:
.cfi_startproc
movl 8(%esp), %eax
addl 4(%esp), %eax
ret
.cfi_endproc
.LFE39:
.size add, .-add
.globl main
.type main, @function
main:
.LFB40:
.cfi_startproc
movl $30, %eax
ret
.cfi_endproc
.LFE40:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section .note.GNU-stack,"",@progbits
我很惊讶主函数中所有那些算术操作都去哪了? 我不明白我们怎么从无处得到了30(好吧,我猜这是从 add 函数返回的值,但为什么我看不到任何获取该值的命令,实际上我看到返回值已经被推到了 eax 中,在 add 函数中,为什么我们需要再将 $30 移动到 eax 中?)。 所有 main 中的局部变量都在哪里声明?我特意创建了其中的五个,以查看其中一个是如何被推到栈上的。
你能帮我理解所有这些 .LFE39 .LFB40:.LFB39:是什么意思吗?
我正在阅读这本书,但它并没有为我澄清这个问题。 实际上,书中说所有函数都必须从堆栈初始化开始:
pushl %ebp
movl %esp, %ebp
在函数结束时,需要使用pop指令来完成函数。
但是在上面的代码中并没有这样做。我没有看到任何堆栈初始化的过程。
谢谢!