在ARM Arch64寄存器中移动32位常量

时间:2015-01-14 08:41:41

标签: assembly arm arm64

我正在寻找一种在arch64寄存器X1中移动任何32位常量的方法。

有没有办法执行

的等效操作

MOV X1,#imm32

imm32可以是任何随机32位值,如0xaf41d32c

我知道如何使用MOVW和MOVT在A32中完成。我不想使用LDR X1,= 0xaf41d32c,因为我不直接编写汇编代码,而是通过在内存中写入32位ARM编码来将指令存储在缓存中。所以我基本上不能形成LDR X1的编码,= 0xaf41d32c。

对于eg =>根据ARMv7 ref手动编码指令ADD R1,R1,#1为0xe2811001。所以我将它存储在一个位置的I Cache中,然后从该位置开始执行。

是否存在A64等效的MOVW和MOVT?你能建议一个解决方案吗?

1 个答案:

答案 0 :(得分:4)

请参阅movk

$ echo "long foo() {return 0xaf41d32c;}" | aarch64-linux-android-gcc -O2 -S -o- -xc -
    .cpu generic+fp+simd
    .file   ""
    .text
    .align  2
    .global foo
    .type   foo, %function
foo:
    mov x0, 54060
    movk    x0, 0xaf41, lsl 16
    ret
    .size   foo, .-foo
    .ident  "GCC: (GNU) 4.9 20140827 (prerelease)"
    .section    .note.GNU-stack,"",%progbits