这是一个基本的 ARM 概念。尝试谷歌 ARM 条件执行或指令。例如,今天戴夫的太空帖子很好地概述了这个概念。同样,从Stackoverflow ARM wiki引用的 Wikipedia 文章也包含有关此主题的信息。
简而言之,ARM 有四个条件位或标志NZCV note ; 这些是任何汇编程序/机器语言的标准概念。他们是,
- N为负数。
- Z为零。
- C为携带。
- V表示溢出。
ARM 有 16 个条件执行前缀,表示在一个四位字段中,用于测试条件位的变化,
- 0000 -
EQ
表示设置为零标志的等于。
- 0001 -表示
NE
不等于清零。
- 0010 -
CS
表示进位集或HS
表示无符号更高或与进位集相同。
- 0011 -
CC
表示进位清零或LO
无符号低位进位清零。
- 0100 -
MI
表示 设置了负标志的负数或负数。
- 0101 -
PL
表示加号(包括零),负号标志清零。
- 0110 -
VS
表示设置了溢出标志的溢出。
- 0111 -
VC
表示没有溢出,溢出清除。
- 1000 -
HI
表示带有进位设置和零清除的无符号更高。
- 1001 -
LS
表示 无符号较低或相同,带有清零和 零集。
- 1010 -
GE
表示 有符号大于或等于负数等于溢出。
- 1011 -
LT
表示 有符号小于,负数不等于溢出。
- 1100 -
GT
表示 有符号大于零清除和 负等于溢出。
- 1101 -
LE
表示 有符号小于或等于零设置且负数 不等于溢出。
- 1110——
AL
意思是 永远。如果汇编程序中没有条件部分,则使用此编码。
- 1111 -
NV
; 这是历史性的并且已被弃用,但对于 ARMv3,它意味着never。即一个nop
。对于较新的 ARM (ARMv5+),这扩展了操作码范围。
几乎所有ARM指令都以这四位字段为前缀。这不适用于Thumb或Thumb2指令。在统一汇编程序(为Thumb2或ARM汇编)中,使用IT
前缀。
一个例子可能如下。你有这个'C'代码,
if(size > 0)
write(fd, buffer, size);
该调用write()
是操作系统调用。以下是一些示例汇编程序,
; fd is in r0, buffer in r1, size in r2
cmp r2, #0 ; if(size > 0)
movgt r7, #NR_write ; OS constant for write().
swigt #0 ; call OS write() if(size > 0)
; code resumes here whether or not the OS was called.
ARM 条件句还有许多其他用途。
注意:所有现代 ARM CPU 都有一个Q(饱和)标志。它的行为方式不同,因为它是指令集的扩展。