2

我有这条装配线:

01000AD8: 979FF103      LDRLS    PC,[PC,R3,LSL #2]

使用 PC = 0x01000AD8

R3 = 0x00000008

CDPS = 800000D3 (所以 C=0, Z=0)

当我执行这一行时,PC 的新值应该是(如果我正确理解 LDRLS*)

PC = 0x01000AD8 + 0x00000008 * 4 = 0x01000AF8

但结果却是 0x00000BAC

为什么?

也许我可以补充一点,执行此行代码时会激活 MMU。

PS *我在研究中没有找到LDRLS中“LS”的含义......

编辑:添加 CPSR 值

4

2 回答 2

3

第一个问题:A2-11 页:

执行 ARM 指令时,PC 读取当前指令的地址加 8。

您忘记将 8 添加到 PC。

第二个问题:A8-124 页:

加载寄存器根据基址寄存器值和偏移寄存器值计算地址,从内存中加载一个字,并将其写入寄存器。

您忘记了“从记忆中加载单词”步骤。

(页码来自 ARM 架构参考手册 for ARMv7-A。您的页码可能不同。)

于 2011-10-19T22:06:15.083 回答
2

当用作操作数时,PC 总是提前两条指令,所以如果手臂模式加 8,如果拇指模式加 4。

LDR 是指令:加载寄存器。LS 表示如果相等,则加载较低或相同的 LDREQ。在 arm arm 中搜索“条件代码”。在这种情况下,指令 0x9 中的前四位是 LS,如果较低或相同则执行。大多数指令将这些位作为 0xE 表示始终执行。

所有的 ARM 指令都使用高四位作为条件码,基本上可以逐条指令有条件地执行,在这种情况下,只有在 C 标志清零或 Z 标志设置时才会执行 LDR。如果它执行加载,那么它就是您计算它的地址,再加上 8,因为地址计算的 PC 输入是起始地址之前的两条指令,那么结果是从该地址加载到 PC 中,所以基本上这个是到计算地址的条件分支。一个分支表。通常你会有一个带有 [ra,rb,lsl #2] 的分支表,其中 ra 是分支表的基地址,rb 是该表的基于索引的索引(元素编号 0 或 1 或 2)和 lsl 2 转索引到字地址,因为这些是 32 位指令。该表包含到分支目的地的地址。用作基础的 PC 意味着该指令之后的下一条指令可能是无条件分支到非条件情况,如果不是 LS,则在表上进行分支,之后的指令是 R3 = 0 的情况,然后是 R3 = 1案例等等。如果编译器知道 R3 永远不会小于某个数字,那么它可能在此之后使用了更多指令,然后在表格上方/周围移动。

无论如何,看看 ARM ARM(现在称为 ARMv5 ARM ARM 或旧版 ARM ARM 或类似的东西)。搜索“条件字段”或“条件代码”以查找表。如果 z 标志设置为 ADDEQ,则助记符扩展附加到指令 ADD 上。如果设置了 N 标志,则减法是 SUBMI 等。

于 2011-10-20T00:50:12.867 回答