C++反汇编obj文件(objconv)

C++程序的编译的时候会把C++代码翻译为汇编代码,然后再把汇编代码转换为obj文件,也就是obj文件里描述了汇编代码的逻辑,我们可以通过工具来把obj文件转换为汇编代码,objconv就是其中一种工具。

objconv用法

下载:https://github.com/gitGNU/objconv
下载后解压。
在这里插入图片描述
压缩包里已经有可以直接使用的exe了,找一个任意的obj文件,复制到objconv目录下,进入命令行,执行以下命令。(我用的obj文件是main.obj)

.\objconv-debug.exe -fyasm .\main.obj main.asm

请添加图片描述
执行成功之后,会生成一个main.asm文件,打开文件就能看到汇编代码了。
在这里插入图片描述

总结

结合以上例子的代码来分析。
请添加图片描述

sub     rsp, 24                     //rsp表示栈顶指针,-24是压栈        
mov     dword [rsp+4H], 10          //在栈顶往后偏移4个字节处填入10,定义变量a
mov     dword [rsp], 15  			//在栈顶位置填入15,定义变量b                     
mov     eax, dword [rsp]            //把变量b的值放入寄存器eax
mov     ecx, dword [rsp+4H]         //把变量a的值放入寄存器ecx
add     ecx, eax                    //两个寄存器相加      
mov     eax, ecx                    //把结果放到eax,eax寄存器用作存放函数的返回值
add     rsp, 24                     //出栈           
ret     

汇编代码与C++的逻辑相符。
分析以上例子可以看到以下几点。
1、进入一个函数时,rsp指针会往前偏移一定的长度,定义的局部变量会存放在这个区间内,函数退出时,rsp会恢复原位,所以函数中的局部变量会在函数结束时被释放。
2、如果函数的调用栈过多,rsp会一直减,而rsp是有限的,减到一定值就不能再减下去了,这也是函数栈溢出的原理。
3、创建变量时,new出来的变量被放在堆,而被直接创建的变量是存在栈,这里的栈应该就是rsp指针所在的栈。
使用反汇编可以直接看到C++程序的实现过程,对了解原理有一定的帮助。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值