(完整版)BCD码指令_第1页
(完整版)BCD码指令_第2页
(完整版)BCD码指令_第3页
(完整版)BCD码指令_第4页
(完整版)BCD码指令_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、BC加指令 AAA DAA AAS DAS AAM AAD(四)十进制数(BCM)运算指令以上我们介绍的是二进制数的算术运算指令,二进制数在计算机上进 行运算是非常简单的。但是,通常人们习惯于用十进制数。在计算机中十进制数 是用BCDK来表 示的,BC则有两类:一类叫压缩型 BC则,一类叫非压缩型 BCDK。用BCDK进行加、减、乘、除运算,通常采用两种方法:一种是在指令 系统中设置一 套专用于BCM运算的指令;另一种是利用二进制数的运算指令 算出结果,然后再用专门的指令对结果进行修正(调整),使之转变为正确的 BCDK表示的结果。8086/8088指令系统所采用的是后一种方法。在进行十进制数

2、算术运算时,应分两步进行: 先按二进制数运算规则进行运算,得到中间结果。再用十进制调整指令对中间结果进行修正,得到正确的结果。31423=570011 010023的 BCD 码十 0010 001123的BCD区0101 011T 57 的 BGD 码下面通过几个例子说明BCDK运算为什么要调整以及怎样调整。43+23=77O1DD 1000船的 BCD 码十 0010 1D0129 的 BCD 社0111 000171的 BCD 码结果正确,这时调整指令不需要做什么。结果不正确,因为在进行二进制加法运算时,低4位向高4位有一个进 位,这个进位是按十六进制进行的,即低4位逢十六才进一,而十进

3、制数应是逢 十进一。因此,比正确结果少 6,这时,调整指令应在低4位上加6。即:owe 1DOO4001P 10G101 1 1 0001卬间结果 AF三1十 口DOltniO加口 6H调整0111 0111 '正确结果,刀的BCD码加法运算后,低4位若向高4位有进位(即AF=D时,调整指令应做 力口 06H处理。57+46=1030101 0111,-0100 0110,1001 1101中间结果J+0000 0110"10100011中间结果/+0110 0000户CF -1 0000 001正确结果CF=1加法运算后,低4位9时,调整指令需做加06H处理;高4位9时,

4、调整指令需做加60H处理。72+91=1630111 0010/一1001 00014CF-1 0000 0011中间结果 CF=101L0 0000*01100011正确结果,加法运算后,当CF=1 (有进位产生)时,调整指令应做加60H处理。前面我们已经详细地介绍了二进制数的算术运算指令,下面主要介绍十 进制数(BC则)的调整指令。1,十进制加法的调整指令根据BCM的种类,对BCM加法进行十进制调整的指令有两条 AAA 和DAA非压缩型BCM加法调整指令AAA (ASCII Adjust for Addition)指令格式:AAAAAAfe称为加法的ASCII调整指令。指令后面不写操作数,

5、但实际上隐 含累加器操作数AL和AH指令的操作为:如果 (AL)A0FH9 或(AF)=1则(AL) (AL)+06H(AH)(AH)+1(AF)1 (CF)一(AF) (AL)一(AL) A0FH)否则(AL)(AL) A0FH)由上可见,指令将影响 AF和CF标志,但状态标志位SF、ZF、PF和OF 的状态不确定。在用AAA旨令调整以前,先用指令 ADD(多字节加法时用ADC进行8 位数的加法运算,相加结果放在 AL中,用AAA旨令调整后,非压缩型BCDK结 果的 低位在AL寄存器,高位在AH寄存器。例如,要求计算两个十进制数之和, 7+8=?。可以先将被加数7、加数8以非压缩型BCM的形

6、式分别存放在寄存器 AL 和BL中,且令AH=Q然后进行加法,再用 AAA指令调整。可用以下指令实现:MOV A,X 0007H ;(AL)=07H, (AH)=00H(BL)=08H(AL)=0FHMOV B,L 08HADD AL, BLAAA(AL)=05H, (AH)=01H, (CF)=(AF)=1以上指令的运行结果为7+8=15,所得之和也以非压缩型BC则的形式 存放,个位在AL,十位在AH例 4.4 计算 4609+3875=?本例要求实现十进制多位数的加法, 假设被加数的每一位数都以 ASCII 码形式存放在内存中,低位在前,高位在后。另外留出4个存储单元,以便存放相加所得的结

7、果,如图 4.19 所示。程序的流程图见图 4.20 。程序如下:LEA SI , STRING1; (SI)一被加数地址指针LEA BX, STRING2 ; (BX)加数地址指针LEADI , SUM;(DI) 一结果地址指针MOVCX, 4;(CX)一循环次数CFCLCADCAL , BX;与加数相加AAA; ASCII 调整MOVDI , AL;送存INCSI ; SI 加 1INCBX;BX 加 1INCDI; DI 加 1DECCX;循环次数减1JNZNEXT;如不为零,转NEXTHLT;停止压缩型BCM加法调整指令DAA (Decimal Adjust for Addition)

8、NEXT: MOV AL , SI;取一个字节被加数指令格式:DAADAA旨令同样不带操作数,实际上隐含寄存器操作数 AL指令的操作为:如果 (AL) A0FH)>9 或 (AF)=1则(AL)(AL)+06H(AF)1如果(AL)>9FH 或(CF)=1则(AL)(AL)+60H(CF) 1与AAA指令不同,DAA只对AL中的内容进行调整,任何时候都不会改 变AH的内容。另外,DAA旨令将影响状态标志位,如 SF、ZF、AF、PF、CF,但 不影响OE例如,要求计算两个2位的十进制数之和,68+59=?。调整之前,也 应先用ADD旨令进行8位数加法运算,相加结果放在 AL中,然后

9、用DAA指令进 行调整。可用以下指令实现:MOV AL, 68H ; (AL)=68HMOV BL, 59H; (BL)=59HADD AL, BL; (AL)=C1H, (AF)=1DAA; (AL)=27H, (CF)=1如果要求对两个位数更多的十进制数进行加法运算, 则也应编写一个循环程序,并采用ADC旨令,在开始循环之前要泊进位标志 CF (参I阅例4.4)。但 采用压缩型BCD®时每次可以相加两位十进制数。 例如,两个8位十进制数相加 时只需循环4 次。为了掌握DAA旨令与AAA旨令的区别,现在再来做前面已经作过的简单 计算,即7+8=?。不过这一次编程时不用 AAA旨令,

10、而改用DAA旨令调整,看看 结果有什么不同。MOV AX, 0007H ; (AL)=07H, (AH)=00HMOV BL, 08H; (BL)=08HADD AL, BL; (AL)=0FHDAA; (AL)=15H, (AH)=00H, (AF)=1 , (CF)=0可见,现在7加8所得之和以压缩型BCD3的形式存放在AL寄存器中, 而AH的内容不变。2,十进制减法的调整指令同加法一样,对BC则减法进行十进制调整的指令也有两条 AASffi DAS非压缩型BCDK减法调整指令AAS (ASCII Adjust for Subtraction)指令格式:AASAASfi称为减法的ASCII

11、码的调整指令。隐含寄存器操作数为AL和AHAAS旨令对非压缩型BCM减法的计算结果进行行调整,以得到正确的 结果。AAS®令的操作为:如果 (AL)A0FH>9 或 (AF)=1则(AL) (AL) -06H(AH)(AH)-1 (AF)1(CF)一(AF) (AL)一(AL) A0FH)否则 (AL)(AL) A0FH)可见,AAS旨令将影响X态标志位 AF和CF, ! SF、ZF、PF和OF状态 标志位不确定。例如想要进行两位十进制数的减法运算:13 4=?,可先将被减数和减数以非压缩型BCM的形式分别存放在AH (被减数的十位)、AL (被减数的个 位)和BL (减数)中

12、,然后用SUB旨令进行减法,再用AAS令进行调整。可 用以下指令实现:MOV A,X 0103H ; (AH)=01H, (AL)=03HMOV BL , 04H(BL)=04HSUB AL , BL; (AL)=03H-04H=FFHAAS; (AL)=09H, (AH)=0以上指令的执行结果为13-4=9,此结果仍以非压缩型BCDK的形式存放,个位 在AL寄存器,十位AH在寄存器。压缩型BCM减法调整指令DAS (Decimal Adjust for Subtraction)指令格式:DASDAS旨令对减法进行十进制调整,指令隐含寄存器操作数ALo在减法运算时,DAS旨令对压缩型BC则进行

13、调整,具操作为:如果 (AL) A0FH)>9 或 (AF)=1则(AL) (AL) -06H(AF)1如果(AL)>9FH 或(CF)=1则(AL) (AL) -60H(CF) 1与DAA旨令类似,DAS旨令也只对AL寄存器中的内容进行调整,而不 改变AH的内容。DAS旨令也将影响状态标志位 SF、ZF、AF、PF、CF,但不影响 OF。例如要求完成以下十进制数的减法运算: 83-38=? 现在采用压缩型BCDK的形式来存放原始数据,则以上减法运算可用下列几条指令实现:MOV AL , 83H ; (AL)=83HMOV B,L 38H; (BL)=38HSUB AL , BL;

14、 (AL)=4BHDAS; (AL)=45H3.十进制乘除法的调整指令对于十进制数的乘除法运算,8086 8088指令系统只提供了非压缩型BC则的调整指令,而没有提供压缩型BCD3的调整指令。因此,8086/8088 CPU 不能直接进行压缩型BCC®的乘除法运算。非压缩型BCM的乘除法与加减法不同,加减法可以直接用ASCII码参 加运算,而不管其高位上有无数字,只要在加减指令后用一条非压缩型BCD马的调整指令就能得到正确结果。而乘除法要求参加运算的两个数必须是高4位为 0的非压缩型BCD®,低4位为一个十进制数。也就是说,如果 用ASCII码进 行非压缩型BCM乘除法运算

15、的话,在乘除法运算之前,必须将高4位清零。非压缩型BCDK的乘法调整指令AAM (ASCII Adjust for Multiply)指令格式:AAMAAM旨令也是一个隐含了寄存器操作数 AL和AH的指令。在乘法运算时,调整之前,先用 MUL旨令将两个真正的非压缩型的 BCD 码相乘,结果放在AX中,然后用AAM旨令对AL寄存器进行调整,于是在 AX中即可得到正确的非压缩型 BC加的结果,其乘积的高位在 AH中,乘积的低位在 AL中。AAM旨令的操作为:(AH)(AL)/0AH的商 即AL除以10,商送AH(AL) (AL)/0AH的余数即AL除以10,余数送ALAAM旨令的操作实质上是将AL

16、寄存器中的二进制数转换成为非压缩型 的BCM,十位存放在AH寄存器,个位存放在AL寄存器。AAM旨令执行以后,将根据 AL中的结果影响状态标志位 SF、ZF和PF, 但AF、CF和OF的值不定。例如要求进行以下十进制乘法运算:7' 9=?可编程序段如下:MOV AL, 07H ; (AL)=07HMOV BL, 09H; (BL)=09HMUL BL; (AX)=07H' 09H=003FHAAM; (AH)=06H, (AL)=03H已知7' 9=63。以上指令执行以后,十进制乘积也是以非压缩型 BCM的形式存 放在 AX 中。非压缩型BC加的除法调整指令AAD (A

17、SCII Adjust for Division)指令格式:AADAAD旨令也是一个隐含了寄存器操作数 AL和AH的指令。它是对非压缩 型BC加进行调整,具操作为:(AL) (AH) ' 0AH+(AL)(AH)0即将AH寄存器的内容乘以10并加上AL寄存器的内容,结果送回 AL, 同时将零送AH以上操作实质上是将AX寄存器中非压缩型BCM转换成为真正 的二进制数,并存放在AL寄存器中。执行AADt令以后,将根据AL中的结果影响状态标志位SF、ZF和PF, 但其余几个状态标志位如AF、CF和OF的值则不确定。AAD旨令的用法与其它非压缩型 BC则调整指令(如AAA AAS AAM 有所不同。AAD旨令不是在除法之后,而是在除法之前进行调整,然后用DIV指令进行除法,所得之商还需用 AAM旨令进行调整,方可得到正确的非压缩型 BCD 码的结果。例如想要进行以下十进制除法运算:73+2=?可先将被除数和除数以非 压缩型BCDK的形式分别存放在AX和BL寄存器中,被除数 的十位在AH个位 在AL,除数在BL。先用AAD旨令对AX中的被除数进

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论