簡體   English   中英

操作數必須是 armv8 中的 int 寄存器

[英]operand must be an int register in armv8

我正在 ARMv8 中開發一個程序,當嘗試使用 gcc 編譯它時,我收到以下代碼行的錯誤消息“操作數 3 必須是 integer 寄存器”:

67   mul x2, x2, 8

100  mul x16, x11, 4
117  mul x16, x11, 4

140  mul x16, x12, 4

同樣,我收到錯誤消息“操作數 3 的擴展/移位操作數寄存器中預期有整數寄存器”

66   add x2, xzr, #MAX_DIGITS

142  add x17, xzr, 1

這是什么意思? 我該如何解決?

AArch64 mul沒有采用立即操作數的形式,請查看手冊

請參閱https://godbolt.org/z/79oKc6fxq了解編譯器的作用:shift 而不是 mul 以獲得 2 的冪,否則 mov-immediate 到mul reg,reg,reg之前的寄存器。 或者對於像9這樣的 2^n+1 常量, add x0, x0, x0, lsl #3


add -immediate with xzr是不可能的,因為如果 XZR 是源寄存器,則編譯器用於加 1 ( add reg, reg, #1 ) 的相同語法不會匯編。

對於某些指令,如add -immediate,該寄存器編號是堆棧指針,而不是零寄存器,因此 xzr 不可編碼。 這就說得通了; 有一些指令可以將一個小的 integer 放入寄存器中,但是加/減是您經常需要在堆棧指針上進行的操作。

如果你想具體化一個小立即數,使用mov並讓匯編器找出要使用的操作碼。 如果您編譯return 1; , clang 使用mov x0, #1作為 asm 源代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM