2015-01-14 100 views
3

我正在尋找一種方法來移動arch64寄存器X1中的任何32位常量。在ARM Arch64寄存器中移動一個32位常數

有沒有辦法來執行

MOV X1相當於操作,#IMM32

IMM32可以是任何隨機的32位值,像0xaf41d32c

我知道它可以在A32完成使用MOVW和MOVT。我不想使用LDR X1,= 0xaf41d32c,因爲我不是直接編寫彙編代碼,而是通過在存儲器中寫入其32位ARM編碼來將指令存儲在高速緩存中。所以我基本上不能形成LDR X1的編碼,= 0xaf41d32c。

對於eg =>根據ARMv7 ref手動編碼的指令ADD R1,R1,#1是0xe2811001。所以我將它存儲在I Cache中,然後從該位置開始執行。

是否存在A64等效的MOVW和MOVT?你能提出一個解決方案嗎?

+0

爲什麼[tag:armv7]標籤在這裏? –

+0

我不知道AArch64,但你可以從[文字池](http://en.wikipedia.org/wiki/Literal_pool)加載任何常量,如[this](http://stackoverflow.com/questions/3914210)/loading-an-address-in-mips64/6507814#6507814)(在MIPS中,但類似的方法也用於ARM,特別是ARM 32) –

回答

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 
相關問題