Rx与[Rx]的差值

  • 本文关键字:Rx assembly arm lpc
  • 更新时间 :
  • 英文 :

LDR R0, R1    ; statement 1
LDR R0, [R1]  ; statement 2

两个语句的区别是什么?

在语句1中,寄存器的地址是否存储在R0中?

在语句2中,R1指向的4字节数据是否被加载到R0中?

是,ldr r0, [r1]从内存中加载4个字节,使用R1作为地址。

ldr的第二个操作数必须是内存,使用某种寻址模式1,而不是一个裸寄存器。

LDR R0, R1是语法错误,或者试图使用R1作为符号名(像任何其他字符串,如ldr r0, foo),而不是寄存器。如果您费心去尝试它,您会看到类似Error: internal_relocation (type: OFFSET_IMM) not fixed up(来自GNUas)的错误消息。当你的源文件不包含ldr r0, foo标签时,你会得到同样的错误信息。

(如果您的源代码中有一个R1:标签,这个ldr R0, R1加载将引用它。再次拆卸,如果该标签在2个指令之后,您将得到ldr r0, [pc, #4]。同样,如果您使用foo而不是R1作为符号名称,则完全相同。对于人类的可读性来说,使用寄存器名作为符号是一个坏主意,但是如果您实际使用GNU汇编程序(来自GNU binutils)这样做,就会发生这种情况。LDR指令如何将常量加载到寄存器中?显示一个示例)

如果你想复制寄存器,使用mov r0, r1,一个不同于ldr的助记符(和机器码操作码)。


脚注1:或者存在ldr的伪指令形式,如ldr r0, =0x1234,将一个常量放入寄存器中,其中包含汇编程序选择的指令,或者在某些汇编程序中总是从附近的"文字池"中加载与pc相关的内容。但是,在asm源代码中,这种ldr要么汇编成ldr r0, [pc, #offset],要么汇编成一些根本不是ldr的指令。ARM中LDR指令右侧的等号=是什么意思?

相关内容

  • 没有找到相关文章

最新更新