将32位值加载到臂组件中的寄存器

时间:2016-08-01 01:31:50

标签: assembly arm

我想使用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

3 个答案:

答案 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

问候。