4

我想使用 arm 程序集将 1 个 32 位十六进制直接加载到寄存器中。

mov r1,#0x6c617669

这不能使用,因为从这条指令我们只能加载 8 位值。所以我直接从内存中加载了 32 位值。那么如何将 32 位值存储在内存中并使用 arm 程序集将其直接加载到寄存器中呢?

我试过这段代码。

    .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
4

3 回答 3

8

你有两个基本的选择。您可以一次加载它或建立寄存器 8 个非零位

mov r0,#0x12000000             @ construct from 8-bit rotated immediates
orr r0,r0,#0x00340000
orr r0,r0,#0x00005600
orr r0,r0,#0x00000078
...

ldr r1,=0x12345678             @ let the assembler figure out how
...

ldr r3,myconst                 @ explicitly load from a nearby constant
...
myconst: .word 0x12345678

后两者是相同的,equals 技巧只是要求汇编程序将值放在范围内并执行 pc 相对加载。

于 2016-08-01T01:38:11.770 回答
2

根据您的处理器,您可能能够使用另一组指令(即 movw 和 movt)。例如,以下说明不适用于使用 GCC 的 Raspberry Pi 2;但是,它们将适用于 Marvell Armada 370/XP;如果我没记错的话,它是 Cortex-A9

movw r1, #0x6c61
movt r1, #0x7669

...

r1 0x6c617669 1818326633
于 2017-01-04T17:46:23.623 回答
0

您可以通过另一种方式间接而不是直接地做到这一点:

.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

R0 寄存器包含 32 位值,您可以看到调试此代码:

(gdb) start
Temporary breakpoint 1 at 0x103ec
Starting program: /home/pi/asm/kk

Temporary breakpoint 1, 0x000103ec in main ()
(gdb) disassemble
Dump of assembler code for function main:
   0x000103e8 <+0>:     push    {lr}            ; (str lr, [sp, #-4]!)
=> 0x000103ec <+4>:     ldr     r0, [pc, #8]    ; 0x103fc <address_of_value>
   0x000103f0 <+8>:     ldr     r0, [r0]
   0x000103f4 <+12>:    pop     {lr}            ; (ldr lr, [sp], #4)
   0x000103f8 <+16>:    bx      lr
End of assembler dump.
(gdb) info registers r0
r0             0x1      1
(gdb) stepi
0x000103f0 in main ()
(gdb) stepi
0x000103f4 in main ()
(gdb) disassemble
Dump of assembler code for function main:
   0x000103e8 <+0>:     push    {lr}            ; (str lr, [sp, #-4]!)
   0x000103ec <+4>:     ldr     r0, [pc, #8]    ; 0x103fc <address_of_value>
   0x000103f0 <+8>:     ldr     r0, [r0]
=> 0x000103f4 <+12>:    pop     {lr}            ; (ldr lr, [sp], #4)
   0x000103f8 <+16>:    bx      lr
End of assembler dump.
(gdb) info registers r0
r0             0x6c617669       1818326633

问候。

于 2017-01-04T10:21:04.153 回答