我一直在尝试将 arm 指令转换为包括 PC 寄存器的十六进制,例如
ldr rx, [pc, #xx]
我查了《ARM架构参考手册》,LDR指令的描述如下:
问题出现了, 1. cond 值,见指令格式,LDR 指令对应的cond 值是0101(PLUS) 还是?2、Rd为PC寄存器,如何用四位来描述PC[15:12]
我一直在尝试将 arm 指令转换为包括 PC 寄存器的十六进制,例如
ldr rx, [pc, #xx]
我查了《ARM架构参考手册》,LDR指令的描述如下:
问题出现了, 1. cond 值,见指令格式,LDR 指令对应的cond 值是0101(PLUS) 还是?2、Rd为PC寄存器,如何用四位来描述PC[15:12]
解决这个问题的一个非常简单的方法是编写一些代码并反汇编,查看该特定工具链的编码内容,然后将其与文档进行比较......
.globl _start
_start:
ldr r3,hello
nop
nop
nop
nop
hello: .word 0x1234
这使
00000000 <_start>:
0: e59f300c ldr r3, [pc, #12] ; 14 <hello>
4: e1a00000 nop ; (mov r0, r0)
8: e1a00000 nop ; (mov r0, r0)
c: e1a00000 nop ; (mov r0, r0)
10: e1a00000 nop ; (mov r0, r0)
00000014 <hello>:
14: 00001234 andeq r1, r0, r4, lsr r2
有问题的指令
e59f300c
11100101100111110011000000001100
1110 01 0 1 1 0 0 1 1111 0011 000000001100
如前所述,条件代码是 1110,即“始终”。Rn 是 pc,Rd 是 r3。电脑的位是 19:16 而不是 15:12。
在这种情况下,所需的地址是 0x14,指令位于 0x00。因此,对于该指令,执行时 pc 为 0x08,因此 0x14-0x08 为 0x0C,即偏移编码。