反汇编文件(.dis文件)的理解

理解什么是:标号地址、标号名字、指令地址、指令机器码、指令机器码反汇编到的指令

下面以一段dis文件中代码来简单理解一下反汇编的读法(为了方便,部分说明已经卸载代码块双斜杠后面)

led.elf:     file format elf32-littlearm     //表明这是由led.elf文件反汇编得到的dis文件
                                             //文件格式是elf32位的,且是小端模式存放       
Disassembly of section .text:                //说明反汇编文件是.text

00000000 <_start>:                           //标号地址、标号名字
   0:	e59f0050 	ldr	r0, [pc, #80]	; 58 <delay_loop+0x10>  
   4:	e59f1050 	ldr	r1, [pc, #80]	; 5c <delay_loop+0x14>
   8:	e5810000 	str	r0, [r1]

指令地址                                           :号前面的数值

指令机器码                                        e59f0050这一列

指令机器码反汇编到的指令            ldr    r0, [pc, #80]    ; 58 <delay_loop+0x10>  

【补充一小点:CPU工作原理】CPU通过访问指令地址,来访问指令机器码的


/*与上面反汇编代码对应的汇编代码*/
_start:
	ldr r0, =0x11111111		// 从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断这个数
	ldr r1, =0xE0200240		// 是合法立即数还是非法立即数。一般写代码都用ldr伪指令
	str r0, [r1]			// 寄存器间接寻址。功能是把r0中的数写入到r1中的数为地址的内存中去

解读汇编与反汇编的关系:

在反汇编中的这一句ldr    r0, [pc, #80] 其实就是汇编语言中的ldr r0, =0x11111111

解读    0:    e59f0050     ldr    r0, [pc, #80]    ; 58 <delay_loop+0x10>

首先上图(ARM中有两级流水线),PC指向正被取指的指令,而非正在执行的指令(也就是说PC的地址值是正在执行代码的地址值加上8)。故PC的地址值应该是此时的指令地址值0+8,而[pc, #80]表示0+8+80=88但是这是十进制的,十进制的88转换为十六进制为58,也就是我们后面可以看到的58。查看反汇编中的指令地址为0x58所对应的指令机器码如下图,可以看到0x58所对应指令机器码是11111111。到此为止可以看出反汇编文件中的 0:    e59f0050     ldr    r0, [pc, #80]    ; 58 <delay_loop+0x10>汇编文件中的ldr r0, =0x11111111的关系了吧?

还有一种更加直接的方法:

直接方法解读  0:    e59f0050     ldr    r0, [pc, #80]    ; 58 <delay_loop+0x10>

这句代码后面的注释58 <delay_loop+0x10>,注释中的58,这其实就是 执行ldr    r0, [pc, #80]后的指令地址值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值