文章目录
- ARM 标志位介绍
- Zero Condition flag(零标志位)
- 零标志位判断实例
上篇文章:ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习
下篇文章:ARM64 常见汇编指令学习 16 – ARM64 SMC 指令
ARM 标志位介绍
在ARM架构中,处理器的状态寄存器(例如CPSR)有一些标志位,用于表示特定的状态或结果。以下是这些标志位的含义:
- N(Negative):负标志位。如果操作的结果是负数,那么N位将被设置为1。
- Z(Zero):零标志位。如果操作的结果是零,那么Z位将被设置为1。
- C(Carry):进位标志位。如果操作导致了进位或借位,那么C位将被设置为1。
- V(Overflow):溢出标志位。如果操作的结果导致了算术溢出,那么V位将被设置为1。
这些标志位主要用于条件指令,如CMP
(比较)、ADD
(加法)、SUB
(减法)等,以及条件跳转指令,如BEQ
(等于时跳转)、BNE
(不等于时跳转)、BGT
(大于时跳转)、BLT
(小于时跳转)等。
例如:
- 使用
CMP
指令比较两个值后,可以通过检查Z位是否被设置来判断这两个值是否相等。 - 使用
ADD
指令进行加法操作后,可以通过检查C位是否被设置来判断是否发生了进位。 - 使用
SUB
指令进行减法操作后,可以通过检查N位是否被设置来判断结果是否为负数。 - 使用任何可以导致溢出的算术操作(如加法或乘法)后,可以通过检查V位是否被设置来判断是否发生了溢出。
总的来说,这些标志位为ARM处理器提供了一种检查和响应各种操作结果的机制,这对于许多编程任务来说是非常重要的。
Zero Condition flag(零标志位)
在ARM架构中,有许多指令在执行后会影响零标志位(Z),或者根据零标志位(Z)的状态来决定其行为。以下是一些常见的例子:
-
CMP
(Compare):这条指令用于比较两个寄存器的值。它会执行一个减法操作,并根据结果设置条件标志,包括零标志位。如果两个值相等,那么结果为零,零标志位会被设置。 -
TST
(Test):这条指令用于测试两个寄存器的值。它会执行一个位与(AND)操作,并根据结果设置条件标志,包括零标志位。如果两个值的AND结果为零,那么零标志位会被设置。 -
ANDS
(Bitwise AND with Set Flags):这条指令执行一个位与操作,并根据结果设置条件标志,包括零标志位。 -
BEQ
(Branch if Equal)和BNE(Branch if Not Equal):这两条指令都会根据零标志位的状态决定是否跳转。如果零标志位被设置(表示最后一次比较或测试的结果为零),BEQ
会导致处理器跳转到指定的位置,BNE
则不会跳转;如果零标志位被清除,BEQ不会跳转,BNE会跳转。
这只是零标志位在ARM中的一些用途。在实际编程中,零标志位的状态通常用于判断某个操作的结果是否为零,或者两个值是否相等。
零标志位判断实例
tst r0 , #0x2 //进行and运算,如果bit2为1,zero==0,如果bit2为0,则zero==1,即该指令测试bit2是否为0
bne led_blink //非零则跳转,若zero==1,跳转到led_blink处执行;若zero==0,则继续执行下一步指令
sub r1 , r1 , #1 //r1=r1-1
cmp r1 , #0 //r1是否等于0,并更改标志位
bne led_blink //zero==1时跳转至led_blink处,zero==0时则继续执行
上篇文章:ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习
下篇文章:ARM64 常见汇编指令学习 16 – ARM64 SMC 指令