QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2218|回复: 10

问段汇编代码的意思?怎么和.c程序联系起来??在线

[复制链接]
发表于 2005-4-23 20:27:05 | 显示全部楼层 |阅读模式
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
 楼主| 发表于 2005-4-23 22:40:47 | 显示全部楼层
push %ebp
mov %esp,%ebp 不知道什么作用?
回复

使用道具 举报

发表于 2005-4-25 17:26:04 | 显示全部楼层
Those two instructions are used to build the stack frame of a function.
回复

使用道具 举报

 楼主| 发表于 2005-4-27 12:44:32 | 显示全部楼层
那别的呢??
回复

使用道具 举报

发表于 2005-4-27 19:32:45 | 显示全部楼层
What do u want to know?
回复

使用道具 举报

发表于 2005-5-4 17:48:55 | 显示全部楼层
[quote:436f9e4d96="zjasan"]push %ebp
mov %esp,%ebp 不知道什么作用?[/quote]

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

使用道具 举报

发表于 2005-8-18 12:01:16 | 显示全部楼层
看看AT&T汇编吧...
没有记错的话应该是保存函数入口吧....
留任后面返回的时候用
回复

使用道具 举报

发表于 2005-8-19 23:01:24 | 显示全部楼层
在你这个程序里没什么用处。因为在函数调用的时候需要压入若干参数,函数调用完毕栈顶指针esp需要恢复原样,所以先把现在的esp放到ebp里边,等调用完毕之后之需要movl %ebp, %esp
pop %ebp就回到原样了
回复

使用道具 举报

发表于 2005-8-25 23:51:25 | 显示全部楼层
编译的时候用这样的参数:
gcc -c -g xx.c
用这个命令看汇编:
objdump -S xx.o
如果是编译成可执行文件,也可以这样看,就是输出比较多,得稍微找一下。
回复

使用道具 举报

发表于 2005-9-10 21:07:03 | 显示全部楼层
这是用于打开堆栈页面;EBP指针被用来寻址函数参数以及局部变量。所以要先保存。
回复

使用道具 举报

发表于 2005-9-12 19:46:11 | 显示全部楼层
建议可能的话买一本《深入理解计算机系统》仔细研究,可以解开很多疑惑,包括以上的一些问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-4 14:16 , Processed in 0.102563 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表