设al=04h,bl=08h,执行mul b汇编语言mul指令令后,结果是

4041人阅读
ASM 汇编(9)
十进制数(BCD码)运算指令
&&&&以上我们介绍的是二进制数的算术运算指令,二进制数在计算机上进行运算是非常简单的。但是,通常人们习惯于用十进制数。在计算机中十进制数是用BCD码来表示的,BCD码有两类:一类叫压缩型BCD码,一类叫非压缩型BCD码。用BCD码进行加、减、乘、除运算,通常采用两种方法:一种是在指令系统中设置一套专用于BCD码运算的指令;另一种是利用二进制数的运算指令算出结果,然后再用专门的指令对结果进行修正(调整),使之转变为正确的BCD码表示的结果。指令系统所采用的是后一种方法。
&&&&在进行十进制数算术运算时,应分两步进行:
&&&&①&先按二进制数运算规则进行运算,得到中间结果。
&&&&②&再用十进制调整指令对中间结果进行修正,得到正确的结果。
&下面通过几个例子说明BCD码运算为什么要调整以及怎样调整。
结果正确,这时调整指令不需要做什么。
&&&&结果不正确,因为在进行二进制加法运算时,低4位向高4位有一个进位,这个进位是按十六进制进行的,即低4位逢十六才进一,而十进制数应是逢十进一。因此,比正确结果少6,这时,调整指令应在低4位上加6。即:
&&&&加法运算后,低4位若向高4位有进位(即AF=1)时,调整指令应做加06H处理。
&&&&加法运算后,低4位&9时,调整指令需做加06H处理;高4位&9时,调整指令需做加60H处理。
&&&&加法运算后,当CF=1(有进位产生)时,调整指令应做加60H处理。
&&&&前面我们已经详细地介绍了二进制数的算术运算指令,下面主要介绍十进制数(BCD码)的调整指令。
&&&&⒈&十进制加法的调整指令
&&&&根据BCD码的种类,对BCD码加法进行十进制调整的指令有两条AAA和DAA。
&&&&⑴&非压缩型BCD码加法调整指令AAA&(ASCII&Adjust&for&Addition)
&&&&指令格式:
&&&&AAA也称为加法的ASCII调整指令。指令后面不写操作数,但实际上隐含累加器操作数AL和AH。指令的操作为:
&如果&&(AL)∧0FH&9,或(AF)=1
&则&&&&(AL)←(AL)+06H
&&&&&&&(AH)←(AH)+1
&&&&&&&(AF)←1
&&&&&&&(CF)←(AF)
&&&&&&&(AL)←((AL)∧0FH)
&否则&&(AL)←((AL)∧0FH)
&&&&由上可见,指令将影响AF和CF标志,但状态标志位SF、ZF、PF和OF的状态不确定。
&&&&在用AAA指令调整以前,先用指令ADD(多字节加法时用ADC)进行8位数的加法运算,相加结果放在AL中,用AAA指令调整后,非压缩型BCD码结果的低位在AL寄存器,高位在AH寄存器。例如,要求计算两个十进制数之和,7+8=?。可以先将被加数7、加数8以非压缩型BCD码的形式分别存放在寄存器AL和BL中,且令AH=0,然后进行加法,再用AAA指令调整。可用以下指令实现:
&&&&&&&MOV AX,0007H ;(AL)=07H,(AH)=00H
&&&&&&&MOV BL,08H&&&&& ;(BL)=08H
&&&&&&&ADD AL,BL&&&&& ;(AL)=0FH
&&&&&&&AAA&&&&&&&&&&&&&& ;(AL)=05H,(AH)=01H,(CF)=(AF)=1
&&&&以上指令的运行结果为7+8=15,所得之和也以非压缩型BCD码的形式存放,个位在AL,十位在AH。
&&&&例4.4&&计算5=?
本例要求实现十进制多位数的加法,假设被加数的每一位数都以ASCII码形式存放在内存中,低位在前,高位在后。另外留出4个存储单元,以便存放相加所得的结果,如图4.19所示。程序的流程图见图4.20。
&&&&程序如下:
&&&&& LEA SI,STRING1 ;(SI)←被加数地址指针
&&&&& LEA& BX,STRING2& ;(BX)←加数地址指针
&&&&& LEA&& DI,SUM&&&&& ;(DI)←结果地址指针
&&&&& MOV&&CX,4&&&&&&& ;(CX)←循环次数
&&& CLC&&&&&&&&&&&&&&& ;清进位标志CF
&&&&NEXT: MOV&& AL,[SI]&&&&& ;取一个字节被加数
&&&&& ADC&& AL,[BX]&&&&&;与加数相加
&&&&& AAA&&&&&&&&&&&&&&& ;ASCII调整
&&&&& MOV&& [DI],AL&&&& ;送存
&&&&& INC&& SI ;SI加1
&&&&& INC&& BX&&&&&&&&&& ;BX加1
&&&&& INC&& DI&&&&&&&&&&& ;DI加1
&&&&& DEC&& CX&&&&&&&&&& ;循环次数减1
&&&&& JNZ&& NEXT&&&&&&&& ;如不为零,转NEXT
&&&&& HLT&&&&&&&&&&&&&&& ;停止
&&&&⑵&压缩型BCD码加法调整指令DAA&(Decimal&Adjust&for&Addition)
&&&&指令格式:
&&&&DAA指令同样不带操作数,实际上隐含寄存器操作数AL。指令的操作为:
&如果&&((AL)∧0FH)&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,但不影响OF。例如,要求计算两个2位的十进制数之和,68+59=?。调整之前,也应先用ADD指令进行8位数加法运算,相加结果放在AL中,然后用DAA指令进行调整。可用以下指令实现:
&MOV&&AL,68H ;(AL)=68H
&MOV&&BL,59H&&&& ;(BL)=59H
&ADD&&AL,BL&&&&&& ;(AL)=C1H,(AF)=1
&DAA&&&&&&&&&&&&& ;(AL)=27H,(CF)=1
&&&&如果要求对两个位数更多的十进制数进行加法运算,则也应编写一个循环程序,并采用ADC指令,在开始循环之前要清进位标志CF(参阅例4.4)。但采用压缩型BCD码时每次可以相加两位十进制数。例如,两个8位十进制数相加时只需循环4次。
&&&&为了掌握DAA指令与AAA指令的区别,现在再来做前面已经作过的简单计算,即7+8=?。不过这一次编程时不用AAA指令,而改用DAA指令调整,看看结果有什么不同。
&MOV&&AX,0007H ;(AL)=07H,(AH)=00H
&MOV&&BL,08H&&&&&;(BL)=08H
&ADD&&AL,BL&&&&& ;(AL)=0FH
&DAA&&&&&&&&&&&&&& ;(AL)=15H,(AH)=00H,(AF)=1,(CF)=0
&&&&可见,现在7加8所得之和以压缩型BCD码的形式存放在AL寄存器中,而AH的内容不变。
&&&&⒉&十进制减法的调整指令
&&&&同加法一样,对BCD码减法进行十进制调整的指令也有两条AAS和DAS。
&&&&⑴&非压缩型BCD码减法调整指令AAS&(ASCII&Adjust&for&Subtraction)
&&&&指令格式:
&&&&AAS也称为减法的ASCII码的调整指令。隐含寄存器操作数为AL和AH。
&&&&AAS指令对非压缩型BCD码减法的计算结果进行行调整,以得到正确的结果。AAS指令的操作为:
&如果&&(AL)∧0FH&9&&或&&(AF)=1
&则&&&&(AL)←(AL)-06H
&&&&&&&(AH)←(AH)-1
&&&&&&&(AF)←1
&&&&&&&(CF)←(AF)
&&&&&&&(AL)←((AL)∧0FH)
&否则&&(AL)←((AL)∧0FH)
&&&&可见,AAS指令将影响状态标志位AF和CF,但SF、ZF、PF和OF状态标志位不确定。
&&&&例如想要进行两位十进制数的减法运算:13-4=?,可先将被减数和减数以非压缩型BCD码的形式分别存放在AH(被减数的十位)、AL(被减数的个位)和BL(减数)中,然后用SUB指令进行减法,再用AAS指令进行调整。可用以下指令实现:
&MOV AX,0103H ;(AH)=01H,(AL)=03H
&MOV& BL,04H&&&&& ;(BL)=04H
&SUB& AL,BL&&&&& ;(AL)=03H-04H=FFH
&AAS&&&&&&&&&&&&&&& ;(AL)=09H,(AH)=0
以上指令的执行结果为13-4=9,此结果仍以非压缩型BCD码的形式存放,个位在AL寄存器,十位AH在寄存器。
&&&&⑵&压缩型BCD码减法调整指令DAS&(Decimal&Adjust&for&Subtraction)
&&&&指令格式:
&&&&DAS指令对减法进行十进制调整,指令隐含寄存器操作数AL。
&&&&在减法运算时,DAS指令对压缩型BCD码进行调整,其操作为:
&如果&&((AL)∧0FH)&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=?&现在采用压缩型BCD码的形式来存放原始数据,则以上减法运算可用下列几条指令实现:
&MOV& AL,83H ;(AL)=83H
&MOV BL,38H&&&&& ;(BL)=38H
&SUB& AL,BL&&&&& ;(AL)=4BH
&DAS&&&&&&&&&&&&&&& ;(AL)=45H
&&&&⒊&十进制乘除法的调整指令
&&&&对于十进制数的乘除法运算,指令系统只提供了非压缩型BCD码的调整指令,而没有提供压缩型BCD码的调整指令。因此,&CPU不能直接进行压缩型BCD码的乘除法运算。
&&&&非压缩型BCD码的乘除法与加减法不同,加减法可以直接用ASCII码参加运算,而不管其高位上有无数字,只要在加减指令后用一条非压缩型BCD码的调整指令就能得到正确结果。而乘除法要求参加运算的两个数必须是高4位为0的非压缩型BCD码,低4位为一个十进制数。也就是说,如果用ASCII码进行非压缩型BCD码乘除法运算的话,在乘除法运算之前,必须将高4位清零。
&&&&⑴&非压缩型BCD码的乘法调整指令AAM&(ASCII&Adjust&for&Multiply)
&&&&指令格式:
&&&&AAM指令也是一个隐含了寄存器操作数AL和AH的指令。
&&&&在乘法运算时,调整之前,先用MUL指令将两个真正的非压缩型的BCD码相乘,结果放在AX中,然后用AAM指令对AL寄存器进行调整,于是在AX中即可得到正确的非压缩型BCD码的结果,其乘积的高位在AH中,乘积的低位在AL中。AAM指令的操作为:
(AH)←(AL)/0AH的商 即AL除以10,商送AH
(AL)←(AL)/0AH的余数&&&&& 即AL除以10,余数送AL
&&&&AAM指令的操作实质上是将AL寄存器中的二进制数转换成为非压缩型的BCD码,十位存放在AH寄存器,个位存放在AL寄存器。
&&&&AAM指令执行以后,将根据AL中的结果影响状态标志位SF、ZF和PF,但AF、CF和OF的值不定。
&&&&例如要求进行以下十进制乘法运算:7′9=?&可编程序段如下:
&MOV&&AL,07H ;(AL)=07H
&MOV&&BL,09H&&&&&;(BL)=09H
&MUL&&BL&&&&&&&&& ;(AX)=07H′09H=003FH
&AAM&&&&&&&&&&&&& ;(AH)=06H,(AL)=03H
已知7′9=63。以上指令执行以后,十进制乘积也是以非压缩型BCD码的形式存放在AX中。
&&&&⑵&非压缩型BCD码的除法调整指令AAD&(ASCII&Adjust&for&Division)
&&&&指令格式:
&&&&AAD指令也是一个隐含了寄存器操作数AL和AH的指令。它是对非压缩型BCD码进行调整,其操作为:
&&&&&&(AL)←(AH)&′0AH+(AL)
&&&&&&(AH)←0
&&&&即将AH寄存器的内容乘以10并加上AL寄存器的内容,结果送回AL,同时将零送AH。以上操作实质上是将AX寄存器中非压缩型BCD码转换成为真正的二进制数,并存放在AL寄存器中。
&&&&执行AAD指令以后,将根据AL中的结果影响状态标志位SF、ZF和PF,但其余几个状态标志位如AF、CF和OF的值则不确定。
&&&&AAD指令的用法与其它非压缩型BCD码调整指令(如AAA、AAS、AAM)有所不同。AAD指令不是在除法之后,而是在除法之前进行调整,然后用DIV指令进行除法,所得之商还需用AAM指令进行调整,方可得到正确的非压缩型BCD码的结果。
&&&&例如想要进行以下十进制除法运算:73÷2=?可先将被除数和除数以非压缩型BCD码的形式分别存放在AX和BL寄存器中,被除数的十位在AH,个位在AL,除数在BL。先用AAD指令对AX中的被除数进行调整,之后进行除法运算,并对商进行再调整。可编程序段如下:
&&&&&&&&MOV &AX,0703H ;(AH)=07H,(AL)=03H
&&&&&&&&MOV &BL,02H&&&&&;(BL)=02H
&&&&&&&&AAD&&&&&&&&&&&&&&& ;(AL)=49H(即十进制数73)
&&&&&&&&DIV&&&BL&&&&&&&&&& ;(AL)=24H(商),(AH)=01H(余数)
&&&&&&&&AAM&&&&&&&&&&&&&& ;(AH)=03H,(AL)=06H
&&&&已知73÷2=36…1。以上几条指令执行的结果为,在AX中得到非压缩型BCD码的商,但余数被丢失。如果需要保留余数,则应在DIV指令之后,用AAM指令调整之前,将余数暂存到一个寄存器。如果有必要,还应设法对余数也进行调整。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:269254次
积分:3073
积分:3073
排名:第8533名
原创:56篇
转载:113篇
评论:31条
(1)(1)(3)(2)(13)(3)(1)(1)(12)(5)(3)(7)(9)(20)(4)(23)(31)(1)(1)(1)(1)(1)(3)(2)(2)(2)(1)(2)(11)微机原理作业二及答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
微机原理作业二及答案
上传于||文档简介
&&微​机​原​理​及​应​用​的​作​业​答​案​(​周​鸣​)
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢 上传我的文档
 下载
 收藏
毕业于医学院校,在医院工作,有相对丰富的护理经验
 下载此文档
正在努力加载中...
第3章习题与答案
下载积分:1500
内容提示:第3章习题与答案
文档格式:DOC|
浏览次数:13|
上传日期: 10:33:55|
文档星级:
该用户还上传了这些文档
第3章习题与答案
官方公共微信

我要回帖

更多关于 汇编mul指令 的文章

 

随机推荐