【ARM 常见汇编指令学习 5 -- arm64汇编指令 wzr 和 xzr】

文章目录

    • ARM64 zero register
      • ARMv8 zero 寄存器的背景
      • xzr 在寄存器读写操作中的使用

上篇文章:ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别
下篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)

ARM64 zero register

ARMv8 在硬件层名引入了一个新的 zero 寄存器XZR(64-bits), WZR(32-bits)。比如要将某一变量赋值为0x0, 由于ARM不允许直接操作内存单元上的数据就,所以需要先将一个寄存器置0,然后再将这个寄存器的值store到内存单元上,如下:

ldr x1, =0x18ac0000
mov w0, #0
str w0, [x1, #0]

现在有有了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 区别
下篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)

你可能感兴趣的:(#,ARM,常见汇编指令学习,arm开发,WZR,XZR,wzr,xzr,zero,register,ARM,0寄存器)