ARM Cortex M0中的这些指令之间有什么区别?
LDR r1, r2 LDR r1, [r2] MOV r1, r2
字符串有错的吗?如果没有一个是错的,那么当我可以在第一个表达式中输入它时,为什么要使用第二个从内存中加载呢?如果第一个意味着从寄存器加载到寄存器,那么第三个呢?与第二条指令混淆,如果我使用寄存器,我的意思是它的值。注意:我没有模拟器。
qcuzuvrc1#
您给予的第一种形式是错误的。所有形式的LDR和STR(除了标签形式的LDR)都使用方括号括住用于计算目标地址的表达式。这在所有表单中都是一致的,一旦您熟悉了表单,这将使阅读它们变得更容易。例如,
LDR
STR
LDR r0, [r2, #4]
字符串将r2的内容加4,然后从计算出的地址加载到r0中。另一方面,
r2
r0
LDR r0, [r2], #4
型使用r2的 * 未修改的 * 内容作为加载地址,然后 * 将4加到r2(“后增量”)。为了完整起见,最终的常量偏移形式为
LDR r0, [r2, #4]!
型这与第一个例子相同,但在加载后也会将计算出的地址写回r2(“预增量”)。感叹号是“写回字符”,也可以在其他一些指令中出现,如LDM和STM。最后,对于寄存器到寄存器的移动,MOV是您想要的指令。关于这些指令的文档非常好(here适用于Cortex-M0等ARMv 6 M设备)。有一个快速参考卡here适用于所有Thumb和Thumb-2指令集,这非常有用,但前提是您可以阅读它,这可能需要先了解一些关于指令集的知识。
LDM
STM
MOV
1条答案
按热度按时间qcuzuvrc1#
您给予的第一种形式是错误的。所有形式的
LDR
和STR
(除了标签形式的LDR
)都使用方括号括住用于计算目标地址的表达式。这在所有表单中都是一致的,一旦您熟悉了表单,这将使阅读它们变得更容易。例如,
字符串
将
r2
的内容加4,然后从计算出的地址加载到r0
中。另一方面,型
使用
r2
的 * 未修改的 * 内容作为加载地址,然后 * 将4加到r2
(“后增量”)。为了完整起见,最终的常量偏移形式为型
这与第一个例子相同,但在加载后也会将计算出的地址写回
r2
(“预增量”)。感叹号是“写回字符”,也可以在其他一些指令中出现,如LDM
和STM
。最后,对于寄存器到寄存器的移动,
MOV
是您想要的指令。关于这些指令的文档非常好(here适用于Cortex-M0等ARMv 6 M设备)。有一个快速参考卡here适用于所有Thumb和Thumb-2指令集,这非常有用,但前提是您可以阅读它,这可能需要先了解一些关于指令集的知识。