現(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