【汇编语言-5】 标志位、算术逻辑指令、条件转移指令

 

标志位:

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位进位或借位时。

 

START:
        
; 标志位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

 

MOV AX,7896H  ;   AX=7896H,即AH=78H,AL=96H
                   ; 各标志位保持不变
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内容为零 则转移

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值