我想使用arm assembly将1 32位十六进制直接加载到寄存器中。
mov r1,#0x6c617669
这不能使用,因为从这条指令我们只能加载8位值。所以我直接从内存加载32位值。那么如何将32位值存储在内存中并使用臂组件将其直接加载到寄存器中?
我尝试了这段代码。
.global main
main:
sub sp,sp,#4
str lr,[sp,#0]
sub sp,sp,#4
str r0,x
add sp,sp,#4
ldr lr,[sp,#0]
add sp,sp,#4
mov pc,lr
.data
x: .word 0x6c617669
但是会出现以下错误。
test1.s: Assembler messages:
test1.s:45: Error: internal_relocation (type: OFFSET_IMM) not fixed up
答案 0 :(得分:3)
您有两个基本选择。您可以一次加载或建立寄存器8非零位
mov r0,#0x12000000
orr r0,r0,#0x00340000
orr r0,r0,#0x00005600
orr r0,r0,#0x00000078
...
ldr r1,=0x12345678
...
ldr r3,myconst
...
myconst: .word 0x12345678
后两个是相同的,equals技巧只是要求汇编程序将值放在触手可及的范围内并执行pc相对负载。
答案 1 :(得分:1)
根据您的处理器,您可以使用另一组指令(即movw& movt)。例如,下面的说明不适用于使用GCC的Raspberry Pi 2;然而,他们将在Marvell Armada 370 / XP上工作;如果我没记错的话,那就是Cortex-A9
movw r1, #0x6c61
movt r1, #0x7669
...
r1 0x6c617669 1818326633
答案 2 :(得分:0)
您可以通过其他方式间接而非直接地执行此操作:
cd
R0寄存器包含32位值,您可以看到调试此代码:
.data
.balign 4
value: .word 0x6c617669
.text
.global main
main:
push {lr} /* save lr value on stack */
ldr r0, address_of_value /* r0 = &value */
ldr r0, [r0] /* r0 = *r0 = value */
pop {lr} /* load lr (R14) register from stack */
bx lr /* return from main using lr */
address_of_value: .word value
问候。