8086指令系统---算术指令(一)

发布者:mb5362443最新更新时间:2015-09-23 来源: eefocus关键字:指令系统  算术指令 手机看文章 扫描二维码
随时随地手机看文章
  算术指令包括加、减、乘、除指令,它包括对二进制数进行的算术运算的指令,以及对十进制数(用BCD码表示)运算进行调整的指令。执行算术指令都会影响条件标志位,条件标志位包括CF、PF、AF、ZF、SF和OF,它们标志算术运算结果的特征。
 
  ⑴ 加法指令            ⑵ 减法指令
    ADD  加法              SUB  减法
    ADC  带进位加            DEC  减1
    INC  加1               NEG  求补
                       CMP  比较
     

  ⑶ 乘法指令            ⑷ 除法指令
    MUL  无符号数乘法          DIV  无符号数除法
    IMUL 带符号数乘法          IDIV 带符号数除法

  
  ⑸ 符号扩展指令          ⑹ 十进制调整指令
    CBW  字节转换为字          DAA  加法的十进制调整
    CWD  字转换为双字          DAS  减法的十进制调整
                       AAA  加法的ASCII调整
                        AAS  减法的ASCII调整      
                       AAM  乘法的ASCII调整
                       AAD  除法的ASCII调整
  1 加法指令

  ADD dst,src 加法指令(addition)
  执行操作: (dst) ← (src)+(dst)

  ADC dst,src 带进位加指令(add with carry)
  执行操作: (dst) ← (src)+(dst)+CF

  INC opr 加1指令(increment)
  执行操作: (opr) ← (opr)+1

  ADD和ADC指令是双操作数指令,它们的两个操作数不能同时为存储器寻址方式,也就是说,除源操作数为立即数的情况外,源和目的操作数必须有一个是寄存器寻址方式。INC指令是单操作数指令,它可以使用除立即数方式外的任何寻址方式。

  ADD和ADC指令影响条件标志位(也称条件码),INC指令影响除CF外的其它条件码。条件码中最主要的是SF、ZF、CF和OF,加法运算对这四个条件码的设置方法如下:
  SF=1 加法结果为负数(符号位为1)
  SF=0 加法结果为正数(符号位为0)
  ZF=1 加法结果为零
  ZF=0 加法结果不为零
  CF=1 最高有效位向高位有进位
  CF=0 最高有效位向高位无进位
  OF=1 两个同符号数相加(正数+正数,或负数加负数),结果符号与其相反
  OF=0 不同符号数相加时,或同符号数相加,结果符号与其相同

  计算机在执行运算时,并不区别操作数是带符号数还是无符号数,一律按上述规则设置条件码,因此,程序员要清楚当时处理的是什么类型的数据。例如,当加法运算结果的最高有效位为1时,机器将SF置1。如果参加运算的是两个带符号数,那么和的最高有效位是符号位,SF置1说明结果是一个负数。如果参加运算的是两个无符号数,那么和的最高有效位也是数值位,此时SF置0或置1都失去了表示正负数的意义。

  对带符号数和无符号数,它们表示结果溢出的条件标志位也是不同的。上述OF位的设置条件显然只符合带符号数的溢出情况,OF=1表示运算结果是错误的。而无符号数溢出(运算结果超出了有限位的表示范围)时,表现为最高有效位产生进位,因此,CF=1是无符号数溢出的标志。另外,在双字长数运算时,低位字相加设置的CF,说明低位字向高位字有无进位的情况。

  例 MOV  BX,9B8CH  ; (BX)=9B8CH
         ADD  BX,6478H  ; now (BX)=0000H
         9B8A     1001 1011 1000 1010
        + 6476     + 0110 0100 0111 0110
       -----------  --------------------------
       1← 0000    1← 0000 0000 0000 0000

  条件码设置: SF=0  最高有效位(D15)为0
         ZF=1  结果为0
         CF=1  最高有效位向高位有进位
         OF=0  不同符号数相加,不产生溢出

  例 编写执行双精度数(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作数的高位字,BX是源操作数的高位字。指令执行前:
      (DX,CX)= A248 2AC0H,(BX,AX)= 088A E25BH。

   指令序列:  ADD  CX, AX  ;(CX)= 0D1BH
         ADC  DX, BX  ; now,(DX)=0AAD3H

   执行ADD指令:
         2AC0     0010 1010 1100 0000
        + E25B    + 1110 0010 0101 1011
       ---------   ------------------------
       1← 0D1B   1← 0000 1101 0001 1011

  条件码设置: SF=0  最高有效位(D15)为0,无符号位意义
         F=0  结果不为0
         CF=1  最高有效位向高位有进位
         OF=0  加数最高位分别为0、1,溢出位置0,OF对低位字无溢出意义

  执行ADC指令:
         A248     1010 0010 0100 1000
         088A     0000 1000 1000 1011
        +   1     +          1←CF
       ----------  ----------------------------
         AAD3     1010 1010 1101 0011

  条件码设置: SF=1  最高有效位(D31)为1,对带符号数运算表示结果为负
         ZF=0  结果不为0
         CF=0  最高有效位向高位无进位
         OF=0  结果符号与操作数相同,未产生溢出

  2 减法指令

  SUB dst,src 减法指令(subtract)
  执行操作: (dst) ← (dst)-(src)

  SBB dst,src 带借位减法指令(subtract with borrow)
  执行操作: (dst) ← (dst)-(src)-CF

  DEC opr 减1指令(decrement)
  执行操作: (opr) ← (opr)-1

  CMP opr1,opr2 比较指令(compare)
  执行操作: (opr1)-(opr2),根据相减结果设置条件码,但不回送结果

  以上指令除DEC指令不影响CF外,其他都影响条件码。与加法类似,SF和ZF分别表示减法结果的符号以及为零的情况;CF表明无符号数相减结果溢出与否;OF表明带符号数相减结果溢出与否。但在对CF和OF位的设置方法上减法和加法有所不同,下面对此做进一步说明:
  CF=1   二进制减法运算中最高有效位向高位有借位(被减数<减数,不够减的情况)
  CF=0   二进制减法运算中最高有效位向高位无借位(被减数≥减数,够减的情况)
  OF=1   两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同
  OF=0   同符号数相减时,或不同符号数相减,其结果符号与减数不同

  NEG opr 求补指令(negate)
  执行操作: (opr) ← -(opr),
                        
  求补操作即把操作数变为与其符号相反的数:。
  机器在执行求补指令时,把操作数各位求反后末位加1,因此执行的操作也可表示为:
  (opr) ← 0FFFFH-(opr)+1

  NEG指令的条件码设置方法为:
   CF=1  不为0的操作数求补时
   CF=0  为0的操作数求补时
   OF=1  当求补运算的操作数为-128(字节)或-32768(字)时
   OF=0  当求补运算的操作数不为-128(字节)或-32768(字)时

  例 字长为8位的两数相减,其可表示数的范围为:带符号数 -128~127(80H~7FH),无符号数0~255(0~FFH)。运算结果超出可表示数范围即为溢出,说明结果错误。[page]

  ① 43H-16H=2DH
    0100 0011     0100 0011   条件码设置:CF=0
  - 0001 0110    + 1110 1010         OF=0
 --------------    --------------
    0010 1101    1← 0010 1101


  说明:机器作减法运算时,先将减数求补,然后转化为加法运算,所以实际上机器设置CF的方法是:最高有效位不产生进位时,CF=1;最高有效位产生进位时,CF=0。这和做减法时有借位CF=1,无借位CF=0是一致的。
  本例参加运算的数无论是看作带符号数还是无符号数,运算结果均有效。


  ② 0C8H-66H=62H
    1100 1000     1100 1000   条件码设置:CF=0
  - 0110 0110    + 1001 1010         OF=1
  --------------    ------------
    0110 0010    1← 0110 0010

  说明:如果是无符号数的运算,被减数够减无借位,所以CF置0,表明结果有效。如果操作数是带符号数,且被减数与减数符号相反,而结果符号与减数符号相同,所以OF置1,表明结果无效。

   ③ 54H-76H=0DEH
    0101 0100     0101 0100    条件码设置:CF=1
   - 0111 0110   + 1000 1010          OF=0
   -------------    -------------
    1101 1110      1101 1110


  说明:如果是无符号数的运算,本例中被减数<减数,减运算向高位有借位(或加运算无进位),则CF置0,表明结果无效。如果是带符号数的运算,同符号数相减,OF置0,结果有效。

   ④ 4BH-0B6H=0DEH
    0100 1011     0100 1011    条件码设置:CF=1
   - 1011 0110    + 0100 1010          F=1
   ---------------    -----------
    1001 0101      1001 0101

  说明:如果是无符号数的运算,本例中被减数<减数,减运算向高位有借位(或加运算无进位),则CF置0,表明结果无效。如果是带符号数的运算,不同符号数相减,且结果符号与减数符号相同,OF置1,结果也是无效的。

  例 分析下列程序的执行情况:
  
        DATA_A   DD   62562FAH
        DATA_B   DD   412963BH
        RESULT   DD   ?
         …    …   …
        MOV     AX, WORD PTR DATA_A   ; (AX)=62FAH
        SUB    AX, WORD PTR DATA_B   ; sub 963BH from AX
        MOV    WORD PTR RESULT, AX   ; save the result
        MOV    AX, WORD PTR DATA_A+2  ; (AX)=0625H
        SBB    AX, WORD PTR DATA_B+2  ; sub 0412H with borrow
        MOV    WORD PTR RESULT, AX   ; save the result

  答:SUB指令执行后,(AX)= 62FAH-963BH=0CCBFH,CF=1(有借位)。执行SBB指令后,(AX)= 625H-412H-1=212H,CF=0,OF=0,因此,保存于RESULT的结果数据为0212CCBFH。

   3 乘法指令

  MUL  src  无符号数乘法(unsigned multiple)
  IMUL src  带符号数乘法(signed multiple)
  字节操作: (AX) ← (AL)×(src)
  字操作:  (DX, AX) ← (AX)×(src)

  MUL和IMUL指令的区别仅在于操作数是无符号数还是带符号数,它们的共同点是,指令中只给出源操作数src,它可以使用除立即数方式以外的任一种寻址方式。目的操作数是隐含的,它只能是累加器(字运算为AX,字节运算为AL)。隐含的乘积寄存器是AX或DX(高位)和AX(低位)。

  乘法指令只影响CF和OF,其它条件码位无定义。无定义是指指令执行后,条件码位的状态不确定,因此它们是无用的。

  MUL指令的条件码设置为:
  CF OF= 0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))
  CF OF= 1 1 乘积的高一半不为0

  这样的条件码设置可以指出字节相乘的结果是8位(CF=0)还是16位(CF=1),字相乘的结果是16位(CF=0)还是32位(CF=1)。

  IMUL指令的条件码设置为:
  CF OF= 0 0 乘积的高一半为低一半的符号扩展
  CF OF= 1 1 其他情况

  符号扩展是指做字节乘法时,乘积低8位的最高位为0,高8位也扩展为0,或者低8位的最高位为1,高8位也扩展为1的情况。对两个字相乘,符号扩展是指乘积的低16位的最高位为0,高16位也扩展为0,或者低16位的最高位为1,高16位也扩展为1的情况。

  例 无符号数乘法 

    ; from the data segment
    DATA1  DB  25H
    DATA2  DB  65H
    RESULT DW ?
    ; from the code segment
      MOV   AL,DATA1
      MOV   BL,DATA2
      MUL   BL        ; register addressing mode
      MOV   RESULT,AX
    or
      MOV   AL,DATA1
      MUL   DATA2       ; direct addressing mode
      MOV   RESULT,AX
    or
      MOV   AL,DATA1
      MOV   SI,OFFSET DATA2
      MUL   BYTE PTR [SI]   ;register indirect addressing mode
      MOV   RESULT,AX

  本例25H×65H=0E99H,高16位不为0,所以CF=1,OF=1。
 
 
  例  

    DATA3  DW  2378H
    DATA4  DW  2F79H
    RESULT1 DW  2 DUP(?)
    …    …
      MOV   AX, DATA3   ; load first operand into AX
      IMUL   DATA4     ; multiply it by the second operand
      MOV   RESULT1, AX  ; store the lower word result
      MOV   RESULT1+2, DX ; store the higher word result

  本例2378H×2F79H=0693 CBB8H,即(DX)=0693H,(AX)=0CBB8H。因为高16位不是低16位的符号扩展,所以条件码设置为CF=1,OF=1。

关键字:指令系统  算术指令 引用地址:8086指令系统---算术指令(一)

上一篇:8086指令系统---串处理指令
下一篇:8086指令系统---算术指令(二)

推荐阅读最新更新时间:2024-03-16 14:32

51单片机教程:单片机寻址方式与指令系统
通过前面的学习,我们已经了解了单片机内部的结构,并且也已经知道,要控制单片机,让它为我们干学,要用指令,我们已学了几条指令,但很零散,从现在开始,我们将要系统地学习8051单片机的指令部份。 一、概述 1、指令的格式 我们已知,要让计算机做事,就得给计算机以指令,并且我们已知,计算机很“笨”,只能懂得数字,如前面我们写进机器的75H,90H,00H等等,所以指令的第一种格式就是机器码格式,也说是数字的形式。但这种形式实在是为难我们人了,太难记了,于是有另一种格式,助记符格式,如MOV P1,#0FFH,这样就好记了。 这两种格式之间的关系呢,我们不难理解,本质上它们完全等价,只是形式不一样而已。 2、汇编 我们写指令使用
[单片机]
可编程控制器的特点有哪些
  可编程控制器使用较多,因此可编程控制器具有很强的现实意义。对于可编程控制器,大家或多或少有所耳闻,但大家未必知晓可编程控制器的几大特点。本文中,小编将对可编程控制器的四大特点予以介绍。如果你对可编程控制器具有兴趣,不妨继续往下阅读哦。   一、功能丰富   可编程控制器的功能非常丰富。这主要与它具有丰富的处理信息的指令系统及存储信息的内部器件有关。   它的指令多达几十条、几百条,可进行各式各样的逻辑问题的处理,还可进行各种类型数据的运算。凡普通计算机能做到的,它也都可作到。   它的内部种种继电器,相当于中间继电器,数量更多。内存中一个位就可作为一个中间继电器,怎么不多!   它的计数器、定时器也很多,是继电
[嵌入式]
PLC的编程语言的基本指令系统与编程方法
    一、 基本指令系统特点   PLC的编程语言与一般计算机语言相比,具有明显的特点,它既不同于高级语言,也不同与一般的汇编语言,它既要满足易于编写,又要满足易于调试的要求。目前,还没有一种对各厂家产品都能兼容的编程语言。如三菱公司的产品有它自己的编程语言,OMRON公司的产品也有它自己的语言。但不管什么型号的 PLC,其编程语言都具有以下特点:   1、图形式指令结构:程序由图形方式表达,指令由不同的图形符号组成,易于理解和记忆。系统的软件开发者已把工业控制中所需的独立运算功能编制成象征性图形,用户根据自己的需要把这些图形进行组合,并填入适当的参数。在逻辑运算部分,几乎所有的厂家都采用类似于继电器控制电路的梯形图,很
[电源管理]
PLC的编程语言的基本<font color='red'>指令系统</font>与编程方法
PIC单片机实现交通灯控制系统
1 引 言   我国机动车辆发展迅速,而城镇道路建设由于历史等各种原因相对滞后。道路拥挤、阻塞现象及交通事故常有发生。如何利用当今计算机与自动控制技术,有效地疏导交通,提高城镇交通路口的通行能力,提高车辆速度,减少交通事故是值得我们研究的新课题。而目前国内利用单片机实行交通管制这方面应用较少。下面分析用PIC实现交通灯控制设计方法。 2 硬件设计   本系统选用美国Microchip公司的PIC16F873单片机。配合一些外围电路完成交通灯自动转换系统。PIC单片机有以下优点: ①采用哈佛结构(数据总线和指令总线分离)。 ②指令的“单字节化”。 ③精简指令集(RISC)技术。 ④寻址方式简单。 ⑤代码压
[单片机]
PIC单片机实现交通灯控制系统
8086指令系统---算术指令(一)
  算术指令包括加、减、乘、除指令,它包括对二进制数进行的算术运算的指令,以及对十进制数(用BCD码表示)运算进行调整的指令。执行算术指令都会影响条件标志位,条件标志位包括CF、PF、AF、ZF、SF和OF,它们标志算术运算结果的特征。     ⑴ 加法指令            ⑵ 减法指令     ADD  加法              SUB  减法     ADC  带进位加            DEC  减1     INC  加1               NEG  求补                        CMP  比较         ⑶ 乘法指令            ⑷ 除法指令     
[单片机]
<font color='red'>8086</font><font color='red'>指令系统</font>---<font color='red'>算术</font><font color='red'>指令</font>(一)
MCS-51单片机指令系统“读-改-写”方式指令
51 单片机有四个 8 位的并行接口。由于内部结构的特点,并行接口在输出 0、1 的时候,能力是不一样的。输出 0 的时候,能力较强,但输出 1 的时候,能力就很差了,而 P0 口,则要外接上拉电阻才能输1。 单片机从端口读入数据的通道有两个,一个是从锁存器引入,一个是从输出引脚处引入,分别叫做“读锁存器”和“读引脚”。单片机在进行端口输出时,经常要参考其上一次的输出状态。 Example:使一个LED灯闪烁。编程序时需要从输出引脚读前一次的输出状态,然后将其求反输出。如果上次是输出“1”使LED点亮,这时候虽然端口上输出逻辑是“1”,但是由于LED的二极管作用将输出高电平拉至“0”电平(0.7V左右),通过引脚读进来就是
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved