zjasan 发表于 2005-4-23 20:27:05

问段汇编代码的意思?怎么和.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

zjasan 发表于 2005-4-23 22:40:47

push %ebp
mov %esp,%ebp 不知道什么作用?

puretears 发表于 2005-4-25 17:26:04

Those two instructions are used to build the stack frame of a function.

zjasan 发表于 2005-4-27 12:44:32

那别的呢??

puretears 发表于 2005-4-27 19:32:45

What do u want to know?

loveletter1000 发表于 2005-5-4 17:48:55

push %ebp
mov %esp,%ebp 不知道什么作用?

这是CPU中的保护现场的作用,目的是为了可以回头(即回到原来的地方不会出错)

pinkme005 发表于 2005-8-18 12:01:16

看看AT&T汇编吧...
没有记错的话应该是保存函数入口吧....
留任后面返回的时候用

suiyun2008 发表于 2005-8-19 23:01:24

在你这个程序里没什么用处。因为在函数调用的时候需要压入若干参数,函数调用完毕栈顶指针esp需要恢复原样,所以先把现在的esp放到ebp里边,等调用完毕之后之需要movl %ebp, %esp
pop %ebp就回到原样了

keenor 发表于 2005-8-25 23:51:25

编译的时候用这样的参数:
gcc -c -g xx.c
用这个命令看汇编:
objdump -S xx.o
如果是编译成可执行文件,也可以这样看,就是输出比较多,得稍微找一下。

冰河时代2 发表于 2005-9-10 21:07:03

这是用于打开堆栈页面;EBP指针被用来寻址函数参数以及局部变量。所以要先保存。

pinper 发表于 2005-9-12 19:46:11

建议可能的话买一本《深入理解计算机系统》仔细研究,可以解开很多疑惑,包括以上的一些问题
页: [1]
查看完整版本: 问段汇编代码的意思?怎么和.c程序联系起来??在线