理解什么是:标号地址、标号名字、指令地址、指令机器码、指令机器码反汇编到的指令
下面以一段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]后的指令地址值