微机原理第三章.doc
《微机原理第三章.doc》由会员分享,可在线阅读,更多相关《微机原理第三章.doc(72页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 可用除法运算将二进制数转换为BCD数。如把AL中的8位无符号二进制数转换为BCD数放入AX中的程序段如下: MOV CL,10 MOV AH,0 ;8位二进制数扩展为16位二进制数 DIV CL MOV CH,AH ;暂存BCD数个位 MOV AH,0 DIV CL MOV CL,4 SHL AH,CL ;BCD数十位移至高4位 OR CH,AH ;BCD数十位与个位拼合 MOV AH,0 MOV CL,10 DIV CL ;AH中的余数为BCD数百位 MOV AL,CH ;BCD数十位与个位送AL用除10取余法将8位二进制数FFH转换为BCD数255H的二进制运算如图3-3所示。 图3-3
2、 8位二进制数FFH转换为BCD数255H的二进制运算除法指令对所有的状态标志位均无定义。3.扩展指令CBW(convert byte to word)和CWD(convert word to double word)从除法指令的操作可知,要把一个8位二进制数除以一个8位二进制数,要有一个16位二进制数在AX中,只是把一个8位的被除数放入AL中是不行的,因为除法指令将把任何在AH中的数当作被除数的高8位。所以在做8位除以8位的除法之前先要把8位被除数扩展为16位,在做16位除以16位的除法之前要把16位被除数扩展为32位,才能保证除法指令的正确操作。这种扩展对于无符号数除法是很容易办到的,只需
3、将AH或DX清0即可。对符号整数除法就不能用将被除数的高半部清0来实现,而要通过扩展符号位来把被除数扩展。例如把2的8位形式1111 1110转换为16位形式1111 1111 1111 1110,即要把高半部全部置1(2的符号位);而把+3的8位形式0000 0011转换成16位形式0000 0000 0000 0011,却要把高半部全部置0(+3的符号位)。指令格式 CBWCWD将字节扩展为字指令CBW所执行的操作是把AL的最高位扩展到AH的所有位。将字扩展为双字指令CWD把AX的最高位扩展到DX的所有位。在做8位除以8位和16位除以16位的除法之前,应先扩展AL或AX中的被除数。例如,在
4、数据段中,有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段是: MOV SI,OFFSET ARRAY MOV AX,SI CWD IDIV WORD PTR 2SI MOV 4SI,AX MOV 6SI,DX一般情况下,都将符号数看作补码数,扩展指令和符号整数除法仅对补码数适用。若特别指出该符号数为原码数,则其扩展和除法运算都要另编程序段实现。3.1.2 BCD数调整指令第2.3节介绍的加减指令和本节介绍的乘除指令都是对二进制数进行操作。二进制数算术运算指令对BCD数进行运算,会得到一个非BCD数或不正确的BCD数。如: 0000 0011B+000
5、0 1001B= 0000 1100B 0000 1001B+0000 0111B= 0001 0000B第一个结果是非BCD数;第二个结果是不正确的BCD数。其原因是BCD数向高位的进位是逢10进1,而4位二进制数向高位进位是逢16进1,中间相差6。若再加上6,就可以得到正确的BCD数: 0000 1100B+0000 0110B= 0001 0010B 0001 0000B+0000 0110B= 0001 0110B8086/8088对BCD数使用二进制数算术运算指令进行运算,然后执行一条能把结果转换成正确的BCD数的专用调整指令来处理BCD数的结果。1.BCD数加法调整指令DAA(de
6、cimal adjust for add)和AAA(ASCII adjust for add)指令格式 DAA AAADAA 指令的意义是将AL中的数当作两个压缩BCD数相加之和来进行调整,得到两位压缩BCD数。具体操作是,若(AL & 0FH) 9或AF=1,则AL加上6;若(AL & 0F0H) 90H或CF=1,则AL加60H。如: MOV AX,3456H ADD AL,AH ;AL=8AH DAA ;AL=90HAAA指令的意义是将AL中的数当作两个非压缩BCD数相加之和进行调整,得到正确的非压缩BCD数送AX。具体操作是,若(AL&0FH) 9或AF=1,则(AL+6)& 0FH送
7、AL,AH加1;否则AL & 0FH送AL,AH不变。应特别注意,AAA指令执行前AH的值。如: MOV AX,0806H ADD AL,AH ;AX=080EH MOV AH,0 AAA ;AX=0104H又如:若要将两个BCD数的ASCII码相加,得到和的ASCII码,可以直接用ASCII码相加,加后再调整: MOV AL,35H ;5 ADD AL,39H ;9,AL=6EH MOV AH,0 AAA ;AX=0104H OR AX,3030H ;AX=3134H即34由调整指令所执行的具体操作可以看到,对结果进行调整时要用到进位标志和辅助进位标志,所以调整指令应紧跟在BCD数作为加数的
8、加法指令之后。所谓“紧跟”是指在调整指令与加法指令之间不得有改变标志位的指令。2.BCD数减法调整指令 DAS(decimal adjust for subtract)和AAS(ASCII adjust for subtract)指令格式 DAS AASDAS指令的功能是将AL中的数当作两个压缩BCD数相减之差来进行调整,得到正确的压缩BCD数。具体操作是:若(AL & 0FH) 9或AF=1,则AL减6,(AL & 0F0H) 90H或CF=1,则AL减60H。如: MOV AX, 5634H SUB AL,AH ;AL=DEH,有借位 DAS ;AL=78H,保持借位即134-56AAS指
9、令的功能是将AL中的数当作两个非压缩BCD数相减之差进行调整得到正确的非压缩BCD数。具体操作是:若(AL & 0FH) 9或AF=1,则(AL-6) & 0FH送AL,AH减1;否则AL & 0FH送AL,AH不变。应特别注意,AAS指令执行前AH的值。如: MOV AX,0806H SUB AL,07H ;AX=08FFH AAS ;AX=0709H3.非压缩BCD数乘除法调整指令 AAM( ASCII adjust for multiply)和AAD(ASCII adjust for divide)压缩BCD数对乘除法的结果不能进行调整,故只有非压缩BCD数乘除法调整指令。指令格式 AA
10、M AADAAM指令的功能是将AL中的小于64H的二进制数进行调整,在AX中得到正确的非压缩BCD数。具体操作是AL/0AH送AH,AL MOD 0AH 送AL。如: MOV AL,63H AAM ;AX=0909HAAD指令的功能是将AX中的两位非压缩BCD数变换为二进制数。在做二位非压缩BCD数除以一位非压缩BCD数时,先将AX中的被除数调整为二进制数,然后用二进制除法指令DIV相除,保存AH中的余数后,再用AAM指令把商变回为非压缩的BCD数。如: MOV AX,0906H MOV DL,06H AAD ;AX=0060H DIV DL ;AL=10H、AH=0 MOV DL,AH ;存
11、余数 AAM ;AX=0106H应注意的是,除法的调整不同于加法、减法和乘法,它们的调整是在相应运算操作之后进行,而除法的调整在除法操作之前进行。调整指令都隐含着AX或AL,都在AX或AL中进行。下面举几个使用调整指令的例子。例3.1已知字变量W1和W2分别存放着两个压缩BCD数,编写求两数之和,并将其和送到 SUM 字节变量中的程序。此例应注意以下两个问题:(1)定义字变量W1和W2的4位数应为BCD数,其后要加H,只有这样定义装入内存中的数据才是4位BCD数。(2)BCD数的加减运算只能做字节运算,不能做字运算。这是因为加减指令把操作数都当作二进制数进行运算,运算之后再用调整指令进行调整,
12、而调整指令只对AL作为目的操作数的加减运算进行调整。程序如下:stack segment stack stack dw 32 dup(?) stack ends data segment W1 DW 8931H W2 DW 5678H SUM DB 3 DUP(?) data ends code segment begin proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV AL, BYTE PTR W1;AL=31H ADD AL, BYTE PTR W2;A
13、L=A9H, CF=0, AF=0DAA ;AL=09H, CF=1MOV SUM, ALMOV AL, BYTE PTR W1+1;AL=89HADC AL, BYTE PTR W2+1;AL=E0H,CF=0,AF=1 DAA ;AL=46H, CF=1MOV SUM+1, ALMOV SUM+2, 0 ;处理向万位的进位RCL SUM+2, 1;也可用指令ADC SUM+2, 0 ret begin endp code ends end begin例3.2已知字变量W1和W2分别存放着两个非压缩BCD数,编写求两数之和,并将其和送到 SUM 字节变量中的程序。定义字变量W1和W2的数应为
14、两位非压缩BCD数,其后要加H。程序如下:stack segment stack stack dw 32 dup(?) stack ends data segment W1 DW 0809H W2 DW 0607H SUM DB 3 DUP(?) data ends code segment begin proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV AL, BYTE PTR W1;AL=09H ADD AL, BYTE PTR W2;AL=10H, AF=
15、1 MOV AH,0AAA ;AL=06H, AH=01HMOV SUM, ALMOV AL,AHADD AL, BYTE PTR W1+1;AL=09HADD AL, BYTE PTR W2+1; AL=0FH, AF=0MOV AH,0AAA ; AL=05H, AH=01HMOV WORD PTR SUM+1, AX ret begin endp code ends end begin 03 07 09 06 03 02 07 02 0D 033FH1BH03 03 03AAMAAMAAA例3.3字变量W和字节变量B分别存放着两个非压缩BCD数,编写求两数之积,(如0307H和09H)并
16、将它存储到JJ字节变量中的程序。 stack segment stack stack dw 32 dup(?) stack ends data segment W DW 0307H B DB 9 JJ DB 3 DUP(?) data ends code segment begin proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax MOV AL, BYTE PTR W ;AL=07H MUL B ;AX=003FHAAM ;AX=0603HMOV WORD PTR J
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 第三
限制150内