全部博文(512)
分类: LINUX
2006-11-08 09:48:15
要重点分析函数的栈结构。要了解由于体系设计的问题,堆栈指针向内存低方向增长,但是数据复制操作等,则是往高内存增长。
当函数调用时候,首先把参数从右往左入栈(通常),然后把当前的指令地址压入堆栈--------------这一部分在函数调用外部进行
函数体内 ,首先要保存ebp,压入堆栈三后,把当前的sp作为该函数的帧指针FP,依据FP界定该函数区域-------------这部分通常在被调函数内处理
从FP往低地址便开始存放该函数的局部变量。
例子源代码:
#include
int
fun(int a,int b);
int
main(void)
{
int
a;
a
=fun(1,2);
return
a;
}
int
fun(int a,int b)
{
int c;
c =a+b;
return
c;
}
[root@localhost
test]# gcc –g tiny.c
对应汇编代码:
[root@localhost
test]# gdb a.out -q
(gdb)
disass main
Dump
of assembler code for function main:
0x
0x
0x
0x080482fa
0x080482fd
0x08048302
0x08048304
0x08048307
0x08048309
0x0804830b
0x08048310
0x08048313
0x08048316
0x08048319
0x
End
of assembler dump.
(gdb)
disass fun
Dump
of assembler code for function fun:
0x0804831b
0x
0x0804831e
0x08048321
0x08048324
0x08048327
0x
0x0804832d
0x0804832e
End
of assembler dump.
chinaunix网友2009-08-16 18:22:21
c语言函数调用详细过程ZZ 这是从别处看到的一篇文章,感觉写的非常深入细致,是作者学习汇编语言的笔记,但是我觉得这篇文章对理解C函数调用非常有帮助,于是参考作者的步骤在自己的linux机器上实现了一下, 并对文章做了一些细小的更改,在此对原作者致谢,如果作者觉得这样有些冒犯的话,请通知我我会立即撤掉。 X86汇编语言学习手记(1) 作者: Badcoffee Email: blog.oliver@gmail.com 2004年10月 原文出处: http://blog.csdn.net/yayong 版权所有: 转载时请务必以超链接形式标明文章原始出处、作者信息及本声明. 这是作者在学习X86汇编过程中的学习笔记,难免有错误和疏漏之处,欢迎指正。 1. 编译环境 OS: Axianux 1.0 Compiler: gcc 3..2.3 Linker: Solaris Link Editors 5.x Debug Tool: gdb Edi
chinaunix网友2009-08-16 18:16:52
Making plain binary files using a C compiler这篇文章真的很好,但是在尝试过程中确发现了一些问题,希望各位指教: int main(){ } 编译完后,反汇编,有如下内容: push %ebp mov %esp,%ebp leave ret 这是这篇文章给出的内容. 而我反编译的结果如下(rh8.0 kernel:2.4.18): push %ebp mov %esp,%ebp sub $0x8,%esp//这句可以勉强理解,可能是为以后定义变量欲留位置,不知对否? and $0xfffffff0,%esp//这里就不好理解了,为什么要把后面的4位全都置0??? mov $0x0, %eax sub %eax,%esp leave ret 请各位指教! -------------------------------------------------------------------------------- [color=red][size=18]以下是偶的答复,请