域名備案關閉網(wǎng)站保溫杯軟文營銷300字
文章目錄
- ARM64 zero register
- ARMv8 zero 寄存器的背景
- xzr 在寄存器讀寫操作中的使用
上篇文章:ARM 常見匯編指令學習 4 – ARM64 比較指令 cbnz 與 b.ne 區(qū)別
下篇文章:ARM 常見匯編指令學習 6 - bic(位清除), orr(位或), eor(異或)
ARM64 zero register
ARMv8 在硬件層名引入了一個新的 zero 寄存器:XZR
(64-bits), WZR
(32-bits)。比如要將某一變量賦值為0x0, 由于ARM不允許直接操作內存單元上的數(shù)據(jù)就,所以需要先將一個寄存器置0,然后再將這個寄存器的值store到內存單元上,如下:
ldr x1, =0x18ac0000
mov w0, #0
str w0, [x1, #0]
現(xiàn)在有有了zero 寄存器,那么一條指令就可以解決上面需要兩條指令才能解決賦值0的問題:
str wzr, [x1, #0]
ARMv8 zero 寄存器的背景
我們知道ARMv8 通用寄存器是X0-X29一共30個,其中X30為鏈接寄存器,那么X31呢?
一般都是知道X31是棧指針寄存器,其實X31的另外一個作用就是zero 寄存器, 那么如何保證兩者在使用時不沖突呢?
這就是在寫匯編代碼時需要注意的地方,如果某條指令使用SP寄存,那么這條指令就不能再使用xzr/wzr寄存器了。
xzr 在寄存器讀寫操作中的使用
ldr x7, =0x18bc0100
mov x8, xzr
ldr w9, =0xffffff00
ldr w8, [x7, #0x3c]
and w8, w8, w9
str w8, [x7, #0x3c]
dsb sy
isb
上面這段匯編對應C代碼為:
uint32_t addr = 0x18bc0100;
uint32_t val = 0x0;val = read32(addr + 0x3c);
val &= 0xffffff00;
write32(val, addr + 0x3c);
下面這段匯編代碼使用了bic 位清除 指令。
ldr x7, =0x18bc0100
mov x8, xzr
ldr w8, [x7, #0x8]
bic w8, w8, #(1<<4)
str w8, [x7, #0x8]
dsb sy
isb
對應的 C code 如下:
uint32_t addr = 0x18bc0100;
uint32_t val = 0x0;val = read32(addr + 0x8);
val &= ~(0x1 << 4);
write32(val, addr + 0x8);
關于 bic(位清除)、orr(位或)、eor (異或)具體使用請見下篇文章。
上篇文章:ARM 常見匯編指令學習 4 – ARM64 比較指令 cbnz 與 b.ne 區(qū)別
下篇文章:ARM 常見匯編指令學習 6 - bic(位清除), orr(位或), eor(異或)