.c文件对应到.s文件中的困惑
Test.c如下:#include<stdio.h>
void fun(void);
int main(void)
{
fun();
return 0;
}
gcc下翻译成Test.s,如下:
.file "Test.c"
.text
.globl main
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
call fun
movl $0, %eax
leave
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
对其中汇编语句
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
不理解各有什么作用,请教一下大家,谢谢!
----------------解决方案--------------------------------------------------------
顶上去
----------------解决方案--------------------------------------------------------
再顶!
----------------解决方案--------------------------------------------------------
没办法,被你的精神感动了。
不知道你反汇编的目的是什么,你汇编基础不扎实就该先学汇编。
等你用汇编写个子函数时你写出来的差不多也是这样,这都成模板了。
pushl %ebp ;将ebp入栈保护
movl %esp, %ebp ;用ebp保留esp当前值,便于取入口参数
subl $8, %esp ;在栈中分配8字节空间,没有实际作用
andl $-16, %esp ;将esp低4位清零,内存对齐
movl $0, %eax ;这里两句是第三次分配空间,也没有实际作用
subl %eax, %esp
C编译为中间代码时编译器会加入很多多余指令,有些是增强安全性防止溢出覆盖,有的是使用通用模板,优化不够造成的,看着很让人生气。即使是蹩脚的汇编程序员写的代码也比优秀的编译器生成的代码强。
[[it] 本帖最后由 VxWorks 于 2008-6-2 22:23 编辑 [/it]]
----------------解决方案--------------------------------------------------------
谢谢VxWorks!
你说的fish是什么东东啊?
----------------解决方案--------------------------------------------------------
FISH is a recursive acronym that stands for"FISH Is Syntax Highlight"
具体可以看这个帖子:
http://bbs.bccn.net/viewthread.php?tid=216338
近期不想继续修改fish了,都已经开源了,希望有人能接着做下去。
[[it] 本帖最后由 VxWorks 于 2008-6-4 09:52 编辑 [/it]]
----------------解决方案--------------------------------------------------------