Assembly ARM汇编代码无法将寄存器值保存到另一个寄存器中?

Assembly ARM汇编代码无法将寄存器值保存到另一个寄存器中?,assembly,arm,Assembly,Arm,我在这里有一种奇怪的行为。 我已经编写了一个简单的函数,将特定地址的值放入两个寄存器。它看起来像这样: .globl GetCurrentCounter GetCurrentCounter: push {lr} bl GetTimerAddress mov r2,r0 ldrd r0,r1,[r2,#4] pop {pc} 只是它不起作用,但如果我省略了将r0分配给r2并直接执行ldrd的步骤,它就会起作用: .globl GetCurrentCounter GetCurr

我在这里有一种奇怪的行为。 我已经编写了一个简单的函数,将特定地址的值放入两个寄存器。它看起来像这样:

.globl GetCurrentCounter
GetCurrentCounter:
  push {lr}
  bl GetTimerAddress
  mov r2,r0
  ldrd r0,r1,[r2,#4]
  pop {pc}
只是它不起作用,但如果我省略了将r0分配给r2并直接执行ldrd的步骤,它就会起作用:

.globl GetCurrentCounter
GetCurrentCounter:
  push {lr}
  bl GetTimerAddress
  ldrd r0,r1,[r0,#4]
  pop {pc}
我不明白为什么会这样

函数GetTimerAddress:

.globl GetTimerAddress
GetTimerAddress:
  ldr r0,=0x20003000
  mov pc,lr

请注意,
[r0,#4]
不是8字节对齐的,因此
ldrd
会导致未定义的行为。也许可以改为尝试
ldm
?您是想在偏移量0x00处读取64位还是在偏移量0x4处读取32位?嗯,ARM中的ldrd伪码意味着,如果地址的下三位不是“000”,它将执行两个单独的加载。我想我必须试着确定一下。@fuz我不确定我是否理解你的意思,但是,问题是计数器的地址是0x20000004,它实际上有8个字节。问题是,它与ldrd一起工作,但前提是我直接使用r0(计时器基址)。如果我先把它分配给r2,它就不能工作,我不明白为什么。@old_timer我想把64位读入两个寄存器(因为每个寄存器只能容纳32位)。。在上述地址。。