博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
调用函数时,寄存器到底发生了那些变化?
阅读量:7001 次
发布时间:2019-06-27

本文共 2258 字,大约阅读时间需要 7 分钟。

一直存在比较模糊的概念,因此用一个例子强化记忆。

linux x86 gcc3.2.3 AT&T格式的汇编
代码如下:
void
fun()
{
int a = 'A';
}
void
main()
{
int b;
fun();
return;
}
开始调试
[sanool@sanool ex2]$ gdb a.out
GNU gdb Red Hat Linux (6.0post-0.20031117.6rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...(no debugging symbols found)...Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) disas main
Dump of assembler code for function main:
0x08048323 <main+0>: push %ebp
0x08048324 <main+1>: mov %esp,%ebp
0x08048326 <main+3>: sub $0x8,%esp
0x08048329 <main+6>: and $0xfffffff0,%esp
0x0804832c <main+9>: mov $0x0,%eax
0x08048331 <main+14>: sub %eax,%esp
0x08048333 <main+16>: call 0x8048314 <fun>
0x08048338 <main+21>: leave
0x08048339 <main+22>: ret
0x0804833a <main+23>: nop
0x0804833b <main+24>: nop
End of assembler dump.
(gdb) disas fun
Dump of assembler code for function fun:
0x08048314 <fun+0>: push %ebp
0x08048315 <fun+1>: mov %esp,%ebp
0x08048317 <fun+3>: sub $0x4,%esp
0x0804831a <fun+6>: movl $0x41,0xfffffffc(%ebp)
0x08048321 <fun+13>: leave
0x08048322 <fun+14>: ret
End of assembler dump.
解释如下:
**当程序下一步执行 0x08048333 <main+16>: call 0x8048314 <fun> 时
esp = 0xbfffe660 (运行时)
ebp = 0xbfffe668 (运行时)
eip = 0x08048333
**然后执行 call 0x8048314<fun> 也就是
push %eip ( 相当于 sub $4 %esp 再 mov %eip %esp )
movl $0x8048314, %eip
则0xbfffe65c 处为 eip = 0x08048338
且esp = 0xbfffe65c
eip = 0x8048314
ebp = 0xbfffe668
**执行0x08048314 <fun+0>: push %ebp后
esp = 0xbfffe658
ebp = 0xbfffe668
0xbfffe658处的值为 ebp = 0xbfffe668
**继续0x08048315 <fun+1>: mov %esp,%ebp
将esp的值赋值给ebp
即 ebp = esp = 0xbfffe658
**开始执行 0x08048321 <fun+13>: leave 前
eip = 0x08048321
ebp = 0xbfffe658
esp = 0xbfffe654
**开始执行 0x08048321 <fun+13>: leave 时
即进行
movl %ebp, %esp ( 即 esp = ebp = 0xbfffe658)
pop %ebp ( 也就是 mov %esp,%ebp 再 add $4,%esp )
此时 ebp = 0xbfffe668 回到了原函数的ebp值,
**再执行 0x08048322 <fun+14>: ret
即 pop %eip
( 也就是 mov %esp,%eip 再 add $4,%esp )
此时 eip = 0x08048338
程序继续执行 main 中的 leave
调用fun函数结束

转载地址:http://bjrvl.baihongyu.com/

你可能感兴趣的文章
HTTP头信息
查看>>
利用Powershell 脚本和定时任务自动批量开邮箱
查看>>
RHCS图形界面建立GFS共享中
查看>>
第一天salt stack 笔记
查看>>
记忆碎片 - 2015.06.17
查看>>
由浅入深学shell脚本编程
查看>>
C#提高知识 ADO.NET实体数据模型 (2)
查看>>
U盘启动盘制作工具分享: 大白菜
查看>>
解决GoAgent打开https网站SSL证书错误 (安全证书不受信任)问题
查看>>
从武侠门派的角度去解释域、域树、林的含义(上)
查看>>
谈谈自己的web开发经历(二):深入web开发
查看>>
Linux运维高薪入门及进阶全新经典视频-老男孩Linux(免费)
查看>>
corosync+pacemaker+http高可用操作手记
查看>>
2013年1月工作小结 -- 上线后的懈怠
查看>>
报表服务入门(实验10)Report Builder制作报表
查看>>
FuseFS之sshfs,将远程服务器文件本地化安全管理
查看>>
Lync和Exchange 2013集成PART4:配置统一存档
查看>>
决定AMD命运的选择题:三大战略市场已定
查看>>
万变不离CHP 天霆“交付”多元化应用
查看>>
VMware View桌面虚拟化在美国医疗行业的应用
查看>>