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

wag*_*sha 4 assembly arm immediate-operand

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

mov r1,#0x6c617669
Run Code Online (Sandbox Code Playgroud)

这不能使用,因为从这条指令我们只能加载 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
Run Code Online (Sandbox Code Playgroud)

但给出以下错误。

test1.s: Assembler messages: 
test1.s:45: Error: internal_relocation (type: OFFSET_IMM) not fixed up
Run Code Online (Sandbox Code Playgroud)

old*_*mer 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
Run Code Online (Sandbox Code Playgroud)

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

  • @Ehsan 你认为是拇指而不是手臂吗?甚至拇指在编码中也有旋转方案。mov r0,#0x12000000 是一个完全有效的arm指令,mov、orr等都工作相同。1001 是四位,在进入寄存器之前可以通过移位器将其旋转 2 的任意幂,因此它完全有效,如 0x81 和 0xFF 等,但 0x102 不是 10000001,尽管有 8 个有效位,但旋转为一位所以这不起作用,但 0x204 是有效的。10000001 8 位旋转 2 次方。0x408 不是,依此类推... (2认同)