|
有一个简单的c程序,代码如下:- //hello.c
- #include <stdio.h>
- int main()
- {
- puts("Hello,Linux!");
- return 0;
- }
复制代码 利用gcc的-S选项生成它的汇编代码:- gcc -S -o hello.s hello.c
复制代码 查看生成的汇编代码:-
- .file "hello.c"
- .section .rodata
- .LC0:
- .string "Hello,Linux!"
- .text
- .globl main
- .type main, @function
- main:
- [color=Red]leal 4(%esp), %ecx
- andl $-16, %esp
- pushl -4(%ecx)[/color]
- pushl %ebp
- movl %esp, %ebp
- [color=Red] [color=Blue]pushl %ecx[/color][/color]
- subl $4, %esp
- movl $.LC0, (%esp)
- call puts
- movl $0, %eax
- addl $4, %esp
- popl %ecx
- popl %ebp
- leal -4(%ecx), %esp
- ret
- .size main, .-main
- .ident "GCC: (GNU) 4.1.2 20070502 (Red Hat 4.1.2-12)"
- .section .note.GNU-stack,"",@progbits
复制代码 问题出来了,
1. main函数中的前三条汇编指令(红色颜色部分)是做什么用的?
2. 在建立好堆栈指针之后,为什么要把ecx压入堆栈(蓝色部分),是不是后面的代码有可能改变ecx的内容,所以要保存在堆栈内,还是有其他的原因?
望高手指点。 |
|