结构体位操作--反汇编(一)

先看下面的代码:

 

假定文件名叫test_struct_bitw.c,使用如下命令:

#gcc -o test_struct_bitw test_struct_bitw.c -g
#objdump -d test_struct_bitw > 1.txt

 反汇编生成如下内容(1.txt为了方便阅读,去掉了很多与本文不相关的内容):

 

这里我们只关心 aa.reserved1= 1; 这句对应的汇编代码,要用到addr2line。我们从反汇编的内容中可以找到 08048324  <main>: 这句,也就是C代码里main函数入口。凭直觉,可能是 804833c这行,使用命令#addr2line -e test_struct_bitw  0x804833c ,输出结果是test_struct_bitw.c:28。显然,我们找到的这句汇编指令就是对应C代码中的28行 aa.reserved1= 1; ,但是不只这一句。同样使用命令#addr2line -e test_struct_bitw  0x8048343 ,#addr2line -e test_struct_bitw  0x8048346 ,输出结果都是test_struct_bitw.c:28,也就是说 aa.reserved1= 1; 这句C代码对应的汇编代码是三句,即:

结合之前的两行代码:

8048332:       c7 05 34 95 04 08 00    movl   $0xffffffff,    0x8049534   

8048339:       00 00 00 

不难看出,就是从0x8049535处取了一个字节(原因是成员reserved1是整个32位成员中的第二个字节,所以地址要从0x8049535开始,同理若是aa.fpga_en= 1;则就应该从0x8049534 处取了),然后进行按位或操作,最后在把位操作后的结果写回到0x8049535地址中去。这里的关键在于要理解  804833c:   0f b6 05 35 95 04 08    movzbl 0x8049535, %eax 这句汇编代码,意思是从0x8049535的内存空间中取一个字节,其余位填0,32位的数据放到eax寄存器中。

操作步骤示意图如下:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值