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

创建时间:2021/12/29 19:49
更新时间:2021/12/29 19:50
标签:bingo, 汇编, 细节知识


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


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

下面以一段dis文件中代码来简单理解一下反汇编的读法(为了方便,部分说明已经卸载代码块双斜杠后面)
指令地址                                           :号前面的数值
指令机器码                                        e59f0050这一列
指令机器码反汇编到的指令            ldr    r0, [pc, #80]    ; 58 <delay_loop+0x10>  
【补充一小点:CPU工作原理】CPU通过访问指令地址,来访问指令机器码的

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

在反汇编中的这一句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]后的指令地址值
Measure
Measure