标志位:
OF 溢出(是/否) OV OVerflow NV Not oVerflow
DF 方向(减量/增量) DN DowN UP UP
IF 中断(允许/关闭) EI Enable Interrupt DI Disable Interrupt
SF 符号(负/正) NG NeGative PL PLus
ZF 零(是/否) ZR ZeRo NZ Not Zero
AF 辅助进位(是/否) AC Auxiliary Carry NA Not Auxiliary
PF 奇偶(是/否) PE Parity Even PO Parity Odd
CF 进位(是/否) CY CarrY NC Not Carry
ZF(Zero Flag):零标志位,用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。
PF(Parity Flag):奇偶标志位,用来反映运算结果中“1”的个数的奇偶性,如果“1”的个数为偶数,则PF的值为1,否则其值为0。
SF(Sign Flag):符号标志位,用来反映运算结果的符号位,它与运算结果的最高位相同。
计算机中通常用补码来表示有符号数。计算机中的一个数据,可以看作是一个有符号数,也可以看作是一个无符号数。比如:
00000001B,可以看作无符号数1,或有符号数+1
10000001B,可以看作无符号数129,或有符号数-127
比如:
mov al, 10000001B
add al, 1
结果:(al) = 10000010B
可以将add指令进行的运算看作无符号数运算,则运算结果是130;可以将add指令进行的运算看作有符号数运算,那么add指令相当于计算-127+1,结果为-126。
SF:在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。如果我们将数据当作无符号数来运算,SF的值无意义。
CF(Carry Flag):进位标志位,用来反映无符号数运算时,运算结果是否产生进位或借位,如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则为0。
OF(Overflow Flag):溢出标志位,用来反映有符号数加减运算所得结果是否溢出。如果运算结果超出当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
由于在进行有符号数运算时,可能发生溢出而造成结果的错误。则CPU需要对指令执行后是否产生溢出进行记录。
一定要注意CF和OF的区别:CF是对无符号数运算有意义的标志位,OF是对有符号数运算有意义的标志位。
DF(Direction Flag):方向标志位,用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
IF(Interrupt Flag):中断标志位,IF=1处理可屏蔽中断,IF=0不出来可屏蔽中断。
TF(Trace Flag):跟踪标志位,该标志可用于程序调试,没有专门的指令来设置或清除。
AF(Auxiliary carry Flag):辅助进位标志位,在字操作时,发生低字节向高字节进位或借位时;在字节操作时,发生低4位向高4位进位或借位时。
; 标志位ZF
MOV AX, 1
SUB AX, 1
MOV AX, 1
AND AX, 0
MOV AX, 1
OR AX, 0
; 标志位IF
CLI
STI
; 标志位DF
CLD
STD
; 标志位PF
MOV AL, 1
ADD AL, 10
MOV AL, 1
OR AL, 2
; 标志位SF, 对有符号数运算结果的一种记录
MOV AL,1 0000001B
ADD AL, 1 ; SF=1
MOV AL,1 0000001B
ADD AL, 01111111B ; SF=0
; 标志位CF, 对无符号数运算结果的一种记录
MOV AL,98H
ADD AL,AL ; CF=1
ADD AL,AL ; CF=0
MOV AL,97H
SUB AL,98H ; CF=1
SUB AL,AL ; CF=0
; 标志位OF, 对有符号数运算结果的一种记录
MOV AL, 98
ADD AL, 99 ; CF=0, OF=1
MOV AL,0F0H
ADD AL,088H ; CF=1, OF=1
MOV AL,0F0H
ADD AL,078H ; CF=1, OF=0
; 各标志位保持不变
ADD AL,AH ; AL=0EH,AH=78H,即AX=780EH
? CF= 1,ZF= 0,SF= 0,OF= 0,AF= 0,PF= 0
ADD AH,AL ; AH=86H,AL=0EH,即AX=860EH
? CF= 0,ZF= 0,SF= 1,OF= 1,AF= 1,PF= 0
ADD AL,0F2H ; AL=00H,AH=86H,即AX=8600H
? CF= 1,ZF= 1,SF= 0,OF= 0,AF= 1,PF= 1
ADD AX,1234H ; AX=9834H,即AH=98,AL=34H
? CF= 0,ZF= 0,SF= 1,OF=O,AF=O,PF= 0
算术逻辑指令:
(1) CMP
CMP OPRD1, OPRD2
这条指令完成操作数OPRD1减去操作数OPRD2,运算结果不送到OPRD1,但影响标志CF、ZF、SF、OF、AF和PF。
比较指令主要用于比较两个数的关系,是否相等,谁大谁小。在执行了比较指令后,可根据ZF判断两者是否相等。
如果两者是无符号数,则可根据CF判断大小;如果两者是有符号数,则要根据SF和OF判断大小。
mov ax,1 ;NV UP EI PL NZ NA PO NC
mov bx,2 ;NV UP EI PL NZ NA PO NC
cmp ax,bx ;NV UP EI NG NZ AC PE CY
(2) AND
AND OPRD1, OPRD2
这条指令完对两个操作数进行按位与运算,结果送到目的操作数OPRD1。
该指令执行以后,CF=0,OF=0,PF、ZF、SF反映运算结果,AF未定义。某个操作数与自己相与,则值不变,但可使CF清0。该指令主要用在使一个操作数中的若干位维持不变,而另外若干位清为0的场合。
(3) TEST
TEST OPRD1, OPRD2
这条指令和AND类似,也把两个操作数进行按位与,但结果不送到操作数OPRD1,仅仅影响标志。该指令执行以后,ZF、PF和SF反映运算结果,CF和OF被清0。该指令通常用于检测某些位是否为1,但又不希望改变原操作数值的场合。例如要检查AL中的位6和位2是否有一位为1,可使用如下指令:
TEST AL, 01000100B
如果位6和位2全为0,那么在执行上面的指令后,ZF被置1,否则ZF被清0。
条件转移指令
指令的汇编格式及功能 根据条件码的值转移:
JZ(JE) ZF=1
JNZ(JNE) ZF=0
JS SF=1
JNS SF=0
JO OF=1
JNO OF=0
JP PF=1
JNP PF=0
JC CF=1
JNC CF=0
比较两个无符号数, 根据比较的结果转移
JB(JNAE,JC) CF=1 被减数小于减数则转移
JNB(JAE,JNC) CF=0 被减数大于或等于减数则转移
JBE(JNA) CF或ZF=1 被减数小于或等于减数则转移
JNBE(JA) CF或ZF=0 被减数大于减数则转移
比较两个带符号数, 根据比较结果转移
JL/JNGE SF异或OF=1 被减数小于减数则转移
JNL/JGE SF异或OF=0 被减数不小于减数则转移
JLE/JNE (SF异或OF)与ZF=1 被减数不大于减数则转移
JNLE/JG (SF异或OF)与ZF=0 被减数大于减数则转移
根据CX寄存器的值转移
JCXZ (CX)=0 CX内容为零 则转移