1

我一直在尝试将 arm 指令转换为包括 PC 寄存器的十六进制,例如

ldr rx, [pc, #xx]

我查了《ARM架构参考手册》,LDR指令的描述如下: 在此处输入图像描述

问题出现了, 1. cond 值,见指令格式,LDR 指令对应的cond 值是0101(PLUS) 还是?2、Rd为PC寄存器,如何用四位来描述PC[15:12]

4

1 回答 1

2

解决这个问题的一个非常简单的方法是编写一些代码并反汇编,查看该特定工具链的编码内容,然后将其与文档进行比较......

.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,即偏移编码。

于 2014-08-15T05:20:03.447 回答