您的位置 首页 国产IC

8086指令系统—算术指令(二)

4除法指令DIVsrc无符号数除法(unsigneddivide)IDIVsrc带符号数除法(signeddivide)字节操作:(AL)larr;(AX)

 4 除法指令

 DIV  src无符号数除法(unsigned divide)
 IDIV src带符号数除法(signed divide)
 字节操作: (AL) ← (AX) / src 的商
      (AH) ← (AX) / src 的余数
 字操作: (AX) ← (DX, AX) / src 的商
     (DX) ← (DX, AX) / src 的余数

 参与运算的除数和被除数是无符号数时,运用DIV指令,其商和余数也均为无符号数。IDIV指令履行的操作与DIV相同,但操作数有必要是带符号数,商和余数也均为带符号数,并且余数的符号与被除数的符号相同。

  这两条除法指令的被除数有必要存放在AX或DX,AX中,源操作数src作为除数,可用除当即数以外的任一种寻址办法来获得。

  除法指令对一切条件码均无界说,因而对除法指令发生的过错,如除数为0或商溢出等过错,程序员都不能用条件码进行判别,而是由体系直接转入0型中止来处理。所谓商溢出,是指被除数高一半的绝对值大于除数的绝对值时,商超出了16位的表明规模(字操作)或8位的表明规模(字节操作)。

  因为运用除法指令的需求,常常要将字节数据扩展为字数据,或许将字数据扩展为双字数据,所以咱们先介绍下面的符号扩展指令,然后再对除法指令举例。

 3.3.2.5 符号扩展指令

 CBW字节扩展为字(convert byte to word)
 
 履行操作:
 (AH)= 00H 当(AL)的最高有用位为0时
 (AH)= FFH 当(AL)的最高有用位为1时

 CWD字扩展为双字(convert word to double word)
 
 履行操作:
 (DX)=0000H当(AX)的最高有用位为0时
 (AH)=FFFFH当(AX)的最高有用位为1时

 这是两条无操作数指令,进行符号扩展的操作数有必要存放在AL寄存器或AX寄存器中。这两条符号扩展指令都不影响条件码。

 留意:
 除法指令要求字操作时,被除数有必要为32位,除数是16位,商和余数是16位的;
 字节操作时,被除数有必要为16位,除数是8位,得到的商和余数是8位的。

 例假定(AX)= 0BA45H,下列指令别离履行后的成果是什么?
          CBW   ; 履行后,(AH)=00, (AL)=45H, 或 (AX)=0045H
          CWD   ; 履行后,(DX)=0FFFFH, (AX)=0BA45H

 例编写程序,别离完结下列数据的无符号除法和带符号除法。
       DATA7  DW 9400H  ; numerator
       DATA8  DW 0060H  ; denominator
       QUOT   DW ?    ; quotient
       REMAIN DW ?    ; remainder
       ; unsigned divide
        MOV  AX,DATA7  ; AX holds numerator
        MOV  DX,0    ; (DX,AX)= 0000 9400H
        DIV  DATA8    ; unsigned divide
        MOV  QUOT,AX   ; quotient is in AX,(AX)=018AH
        MOV  REMAIN,DX ; remainder is in DX,(DX)=0040H
       ; signed divide
        MOV  AX,DATA7  ; (AX)=9400H
        CWD        ; (DX,AX)=0FFFF, 9400H
        IDIV DATA8   ; signed divide
        MOV  QUOT,AX  ; quotient is in AX,(AX)=0FEE0HH
        MOV  REMAIN,DX ; remainder is in DX,(DX)=0

 3.3.2.6 十进制调整指令

  80×86微型机供给了一组十进制调整指令,用来处理ASCII码和BCD码表明的数。
 
  BCD码:
  BCD(Binary Coded Decimal)是用二进制编码表明的十进制数(见表3.3),十进制数选用0~9十个数字,是人们最常用的。在计算机中,同一个数能够用两种BCD格局来表明:①紧缩的BCD码 ②非紧缩的BCD码

  紧缩的BCD码:
  紧缩的BCD码用4位二进制数表明一个十进制数位,整个十进制数用一串BCD码来表明。例如,十进制数59表明成紧缩的BCD码为0101 1001,十进制数1946表明成紧缩的BCD码为0001 1001 0100 0110。

  非紧缩的BCD码:
  非紧缩的BCD码用8位二进制数表明一个十进制数位,其中低4位是BCD码,高4位是0。例如,十进制数78表明成紧缩的BCD码为0000 0111 0000 1000。

 从键盘输入数据时,计算机接纳的是ASCII码,要将ASCII码表明的数转化成BCD码是很简单的,只要把ASCII码的高4位清零即可。

  紧缩的BCD码调整指令
  DAA和DAS指令完结加法和减法的调整功用。

  DAA加法的十进制调整(decimal adjust for addition)
  履行操作:(AL)← 把AL中的和调整为紧缩的BCD格局

  DAS减法的十进制调整(decimal adjust for subtraction)
  履行操作:(AL)← 把AL中的差调整为紧缩的BCD格局

  DAA和DAS指令的调整办法如下:
  履行加法指令(ADD、ADC)或减法指令(SUB、SBB)后,
  1.假如成果的低4位 (AL)0~3>9或AF=1,则(AL)←(AL)±06H,且AF置1;
  2.假如成果的高4位 (AL)4~7>9或CF=1,则(AL)←(AL)±60H,且CF置1。

  对上述办法,加法调整作+06H和+60H,减法调整作-06H和-60H。这两个调整的条件,假如满意其一,则±06H或±60H;假如一起满意,则±06H后,再±60H。

  非紧缩的BCD码调整指令
  AAA加法的ASCII调整(ASCII adjust for add)
  履行操作:
  (AL)← 把AL中的和调整为非紧缩的BCD格局
  (AH)←(AH)+ 调整发生的进位值

  AAS减法的ASCII调整(ASCII adjust for sub)
  履行操作:
  (AL)← 把AL中的差调整为非紧缩的BCD格局
  (AH)←(AH)- 调整发生的借位值

  加法和减法的操作数能够直接运用ASCII码,而不用把高位0011清为0000,AAA和AAS指令便是专门为ASCII码操作数或非紧缩BCD码操作数的加减法而规划的。

  AAA和AAS的调整办法如下:
  履行加法指令(ADD、ADC)或减法指令(SUB、SBB)后,成果存放在AL寄存器中:
  (1)假如(AL)0~3= 0~9,且AF=0,则(AL)4~7= 0,AF的值送CF;
  (2)假如(AL)0~3=A~F,或AF=1,则(AL)←(AL)±06H,(AL)4~7= 0,(AH)←(AH)±1,AF的值送CF。
  AAA和AAS指令除影响AF和CF标志外,其他标志位均无界说。

  AAM乘法的ASCII调整(ASCII adjust for mul)
  履行操作:(AX)← 把AX中的积调整为非紧缩的BCD格局

  AAD除法的ASCII调整(ASCII adjust for div)
  履行操作:(AX)← AX中的被除数(非紧缩的BCD格局)转化为二进制数

  以上两条指令是专为非紧缩的BCD码的乘除法而规划的,它们将乘法和除法的成果转化为非紧缩的BCD码。
  
  留意:AAM和AAD都只对AX寄存器中的数进行调整,它们只影响SF、ZF和PF标志位,其它标志位无界说。

  AAM的调整办法为:
  履行乘法指令(MUL)后,调整存放在AL寄存器中的乘积:
   (AH)←(AL)/ 0AH的商
   (AL)←(AL)/ 0AH的余数

  AAM实际上是将两个一位数的非紧缩BCD码相乘后得到的乘积进行二化十的转化,十位数放在AH中,个位数放在AL中,那么AX中便是乘积的非紧缩BCD码。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/256965.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部