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位)。。在上述地址。。