我在使用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"
有誰知道爲什麼嗎?
我在使用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"
有誰知道爲什麼嗎?
A64指令集對指令中可以使用的立即數種類有非常奇怪的限制。基本的限制是相對直接的,所有指令都是32位長,指令只能使用這32位的一小部分作爲立即值。奇怪的部分是哪些立即值對哪些指令合法。根據ARM編譯程序armasm參考指南中,AND和EOR指令限制立即值:
這種立即被視爲大小的相同元件的載體的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
因爲直接超出範圍?你只能使用有限的一套。首先將其加載到寄存器中。第二個應該工作,但我想。 – Jester
@Jester非他們工作,但首先加載到另一個註冊,使其工作!謝謝 – A23149577