【汇编语言-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内容为零 则转移

 

转载于:https://www.cnblogs.com/JCSU/articles/2138356.html

分支程序设计,循环程序设计,子程序结构 1、练习逻辑运算指令、比较指令条件转移指令的功能、用法以及与标志位的关系和可用的寻址方式 2、用地址表法,完成下面要求的多分支程序的设计。根据MODE单元的模式字(0-7)分别转向L0-L7标号处执行。L0-L7处分别完成显示‘0’-‘7’字符。 当MODE=0时,转L0标号,完成显示‘0’ 当MODE=1时,转L1标号,完成显示‘1’ 当MODE=2时,转L2标号,完成显示‘2’ 当MODE=3时,转L3标号,完成显示‘3’ 当MODE=4时,转L4标号,完成显示‘4’ 当MODE=5时,转L5标号,完成显示‘5’ 当MODE=6时,转L6标号,完成显示‘6’ 当MODE=7时,转L7标号,完成显示‘7’ 3、编制程序实现如下操作: 设有10个学生成绩,分别统计低于60分、60~69分、70~79分、80~89分、90~99分及100分的人数,并存放于S5、S6、S7、S8、S9、S10单元。 实验六: 1. 请编写一程序,从附加段一个未排序的字数组,找出最大数和最小数分别存放在AX 和BX寄存器。 2. 以GRADE为首地址的10个字的数组保存有学生成绩。建立一个10个字的RNAK 数组,并根据GRADE的学生成绩将学生名次填入RANK数组(提示:一个学生的名次等于成绩高于等于该学生的人数加1)。 寄存器分配情况说明如下: AX 存放当前被测学生的成绩 BX 存放当前被测学生的相对地址指针 CX 内循环计数值 DX 存放当前被测学生的名次计数值 SI 内循环测试时的地址指针 DI 外循环计数值 3、数组DATAX,其的数据排列规律是:头三项是0,0,1,以 每项的值均是前三项之和。试将项值小于等于2000以前的各项数据填入数组DATAX。 算法: n≥ 4时: ① an=an-1+an-2+an-3 ② an=2an-1—an-4 要求:按上述两种算法编程 4、从DATA_BUF(1000H)开始存放50个字节数据,编写程序将这些数据由小到大排序,排序后的数据仍放在该区域。 要求原始数据在源程序给出,排序前后的数据以每行10个的格式显示在屏幕上。 5、测量一字符串长度,并用十六进制数显示之
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值