2016-03-02 161 views
1

我在使用AArch64彙編指令中的立即值時遇到問題。我GOOGLE了它,但找不到任何解決方案。我想簡單AND一個w寄存器與即時值如下:ARM AArch64彙編:立即超出範圍

"and w9, w8, #0x5fffffff \n\t"

這給了我immediate out of range at operand 3錯誤。同樣的情況發生在我想x寄存器xor一個立即值:

"eor x0, x0, #ffffffffffffffff"

有誰知道爲什麼嗎?

+2

因爲直接超出範圍?你只能使用有限的一套。首先將其加載到寄存器中。第二個應該工作,但我想。 – Jester

+0

@Jester非他們工作,但首先加載到另一個註冊,使其工作!謝謝 – A23149577

回答

1

A64指令集對指令中可以使用的立即數種類有非常奇怪的限制。基本的限制是相對直接的,所有指令都是32位長,指令只能使用這32位的一小部分作爲立即值。奇怪的部分是哪些立即值對哪些指令合法。根據ARM編譯程序armasm參考指南中,ANDEOR指令限制立即值:

這種立即被視爲大小的相同元件的載體的32位或64位模式 e = 2,4,8,16,32或64個 比特。每個元素包含相同的子模式:單次運行1到e -1 非零位,旋轉0到 -1位。該機制可以生成唯一的64位模式(如2667對模式及其按位逆)。 由於無法用這種方式描述全零和全1值,因此彙編器會生成錯誤消息。

對於第一條指令,您需要先將立即值加載到另一個寄存器中。喜歡的東西:

ldr w10, =0x5fffffff 
and w9, w8, w10 

對於第二個指令,你可以用MVN (bitwise NOT)指令替換:

mvn x0, x0 

注意,最後的指令實際上是對ORN (bitwise OR NOT)指令別名:

orn x0, xzr, x0