北京网站建设公司如何选,网站建设能赚钱吗,优秀文创产品设计案例及分析,制作竞拍网站文章目录 ARM64 zero registerARMv8 zero 寄存器的背景xzr 在寄存器读写操作中的使用 上篇文章#xff1a;ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 下篇文章#xff1a;ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或) ARM64 zero registe… 文章目录 ARM64 zero registerARMv8 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, #(14)
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(异或)