文章目录
- 回顾零标志位Z
- TST 测试指令
上篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令
下篇文章:ARM64 常见汇编指令学习 19 – ARM64 BEQ与B.EQ的区别
回顾零标志位Z
在ARMv8架构中,标志位Z(Zero)是条件码寄存器(Condition Code Register)中的一位,用来表示最近一次算术或逻辑操作的结果是否为零。
如果操作的结果为零,Z标志位会被设置为1
。如果操作的结果不为零,Z标志位会被清零。
例如,以下汇编代码进行了一个减法操作:
MOV R0, #5
MOV R1, #5
SUB R2, R0, R1
在这个例子中,R0
和R1
中的值都是5
,所以它们的差是0,因此Z标志位会被设置为1。
Z标志位通常用在条件分支指令中。例如,BEQ
(Branch if Equal)指令会检查Z标志位,如果Z标志位为1
,就跳转到指定的地址。例如:
MOV R0, #5
MOV R1, #5
SUB R2, R0, R1
BEQ is_zero
// ... is_zero:
// ...
在这个例子中,如果R0
和R1
中的值相等,SUB
指令的结果就是0
,Z标志位就会被设置为1
,然后BEQ
指令就会跳转到is_zero
标签指定的地址。
TST 测试指令
TST
是ARM架构的一个汇编指令,用于测试(Test)两个寄存器中的值。TST
指令执行按位与(AND)操作,但并不将结果保存,而是根据结果来设置条件代码寄存器(Condition Code Register)。
在ARMv8架构中,TST
指令的格式如下:
TST Rn, Operand2
这条指令会将寄存器Rn
中的值和Operand2
进行按位与操作,并根据结果设置条件代码寄存器。如果结果为0
,则Z(Zero)
标志被设置;否则,Z标志被清除。
以下是一个使用TST指令的例子:
MOV x0, #5
MOV x1, #1
TST x0, x1
BEQ zero_labelzero_label:
//...
在这个例子中,首先我们将5
赋值给寄存器x0
,将1
赋值给寄存器x1
。然后,我们使用TST
指令将x0
和x1
中的值进行按位与操作。
由于5
的二进制表示是101
,1
的二进制表示是001
,所以5
和1
的按位与结果是1
。因此,Z标志被清除。
如果将x0
赋值为4(0b100
),那么Z标志将被设置为1
。
总的来说,
TST
指令在你需要根据两个值的按位与结果来改变程序流程时非常有用,如在条件分支或循环中。
上篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令
下篇文章:ARM64 常见汇编指令学习 19 – ARM64 BEQ与B.EQ的区别