A64匯編 VS UAL匯編的差異

現(xiàn)在的ARMv8中存在兩種形式的匯編指令集,一種為兼容32系統(tǒng)架構(gòu)的UAL匯編(UAL是對(duì)之前A32及T32匯編指令集的一種歸一化),另外一種是在64位系統(tǒng)架構(gòu)中使用的A64匯編。

備注:在ARMv8中使用的UAL與ARMv7相比并沒有變化。

A64匯編的一般的句法格式和操作數(shù)順序和UAL匯編相比并沒有什么變化,但是還是存在一些不同,下面對(duì)主要的一些不同進(jìn)行說明:

  • 指令長(zhǎng)度
    A64的指令長(zhǎng)度是固定的32位的,而UAL支持16位和32位的,并支持通過.W和 .N 的寬度說明符來指示匯編器去生成編碼長(zhǎng)度是16位/32位的T32指令(比如:B.W label)。
  • 通用寄存器長(zhǎng)度選擇
    A64可以通過別名把64位的通用寄存器當(dāng)32位的來用,只用到32位長(zhǎng)度用W0-W30,用到64位的長(zhǎng)度用X0-X30,而UAL只有32位的 R0-R15
  • SP, LR, PC的差異
    在A64是不能通過寄存器名字/編號(hào)來訪問PC的,可以訪問LR(與X30同義),而SP只在某些上下文中有意義(SP依賴以編號(hào)31的寄存器,但寄存器編號(hào)為31的寄存器在不同的上下文中可表示為SP,WZR/XZR,需要注意的是A64中是不存在 W31/X31這個(gè)命名的),但UAL中你即可以訪問R13,R14,R15 也可以用SP,LR,PC來代替。
  • 條件執(zhí)行的表示方式
    A64中要進(jìn)行條件執(zhí)行,指令助記符和條件碼之間要有分隔符(用點(diǎn)"."表示),比如B.EQ label,而UAL是沒有分隔符的BEQ label。
  • 無條件執(zhí)行中條件碼作為操作數(shù)
    A64提供了幾種把條件碼當(dāng)作操作數(shù)的無條件執(zhí)行指令(比如:CSEL w1,w2,w3,EQ,這邊的最后一個(gè)位置是條件碼),而UAL中只有IT支持把條件碼當(dāng)做操作數(shù)。
  • 擴(kuò)展運(yùn)算符
    A64在多個(gè)指令中可支持控制第二個(gè)源寄存器的值進(jìn)行部分符號(hào)/零擴(kuò)展(比如:ADD X1, X2, W3, UXTB #2,其中UXTB是擴(kuò)展類型表示零擴(kuò)展),UAL中沒有類似的擴(kuò)展運(yùn)算符。

參考資料

【1】DUI0801I_armasm_user_guide

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容