问段汇编代码的意思?怎么和.c程序联系起来??在线
test.c 代码:#include<stdio.h>
void hi(void)
{
printf("hi");
}
int main(int argc, char *argv[])
{
hi();
return 0;
}
//编译时没有任何优化,请教下面的汇编代码的理解,实在不知道具体是怎么生成的..
//我的环境gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)+GNU gdb Red Hat Linux (6.1post-1.20040607.41rh)
main函数的汇编代码:
0x08048380 <main+0>: push %ebp
0x08048381 <main+1>: mov %esp,%ebp
0x08048383 <main+3>: sub $0x8,%esp
0x08048386 <main+6>: and $0xfffffff0,%esp
0x08048389 <main+9>: mov $0x0,%eax
0x0804838e <main+14>: add $0xf,%eax
0x08048391 <main+17>: add $0xf,%eax
0x08048394 <main+20>: shr $0x4,%eax
0x08048397 <main+23>: shl $0x4,%eax
0x0804839a <main+26>: sub %eax,%esp
0x0804839c <main+28>: call 0x8048368 <hi>
0x080483a1 <main+33>: mov $0x0,%eax
0x080483a6 <main+38>: leave
0x080483a7 <main+39>: ret
hi函数的汇编代码:
0x08048368 <hi+0>: push %ebp
0x08048369 <hi+1>: mov %esp,%ebp
0x0804836b <hi+3>: sub $0x8,%esp
0x0804836e <hi+6>: sub $0xc,%esp
0x08048371 <hi+9>: push $0x8048488
0x08048376 <hi+14>: call 0x80482b0 <_init+56>
0x0804837b <hi+19>: add $0x10,%esp
0x0804837e <hi+22>: leave
0x0804837f <hi+23>: ret push %ebp
mov %esp,%ebp 不知道什么作用? Those two instructions are used to build the stack frame of a function. 那别的呢?? What do u want to know? push %ebp
mov %esp,%ebp 不知道什么作用?
这是CPU中的保护现场的作用,目的是为了可以回头(即回到原来的地方不会出错) 看看AT&T汇编吧...
没有记错的话应该是保存函数入口吧....
留任后面返回的时候用 在你这个程序里没什么用处。因为在函数调用的时候需要压入若干参数,函数调用完毕栈顶指针esp需要恢复原样,所以先把现在的esp放到ebp里边,等调用完毕之后之需要movl %ebp, %esp
pop %ebp就回到原样了 编译的时候用这样的参数:
gcc -c -g xx.c
用这个命令看汇编:
objdump -S xx.o
如果是编译成可执行文件,也可以这样看,就是输出比较多,得稍微找一下。 这是用于打开堆栈页面;EBP指针被用来寻址函数参数以及局部变量。所以要先保存。 建议可能的话买一本《深入理解计算机系统》仔细研究,可以解开很多疑惑,包括以上的一些问题
页:
[1]