微机原理第三章.docx
可用除法运算将二进制数转换为BCD数。如把AL中的8位无符号二进制数转换为BCD数放入AX中的程序段如下:
MOVCL,10
MOVAH,0 ;8位二进制数扩展为16位二进制数DIVCL
MOVCH,AH ;暂存BCD数个位MOVAH,0
DIVCLMOVCL,4
SHLAH,CL ;BCD数十位移至高4位
ORCH,AH ;BCD数十位与个位拼合
MOVAH,0MOVCL,10
DIVCL ;AH中的余数为BCD数百位
MOVAL,CH ;BCD数十位与个位送AL
用除10取余法将8位二进制数FFH转换为BCD数255H的二进制运算如图3-3所示。
图3-38位二进制数FFH转换为BCD数255H的二进制运算除法指令对所有的状态标志位均无定义。
3.扩展指令CBW(convertbytetoword)和CWD(convertwordtodoubleword)
从除法指令的操作可知,要把一个8位二进制数除以一个8位二进制数,要有一个16位二进制数在AX中,只是把一个8位的被除数放入AL中是不行的,因为除法指令将把任何在AH中的数当作被除数的高8位。所以在做8位除以8位的除法之前先要把8位被除数扩展为16位,在做16位除以16位的除法之前要把16位被除数扩展为32位,才能保证除法指令的正确操作。这种扩展对于无符号数除法是很容易办到的,只需将AH或DX清0即可。对符号整数除法就不能用将被除数的高半部清0来实现,而要通过扩展符号位来把被除数扩展。例如把-2的8位形式11111110转换为16位形式1111111111111110,即要把
高半部全部置1(-2的符号位);而把+3的8位形式00000011转换成16位形式0000000000000011,却要把高半部全部置‘0’(+3的符号位)。
指令格式 CBW
CWD
将字节扩展为字指令CBW所执行的操作是把AL的最高位扩展到AH的所有位。将字扩展为双字指令CWD把AX的最高位扩展到DX的所有位。在做8位除以8位和16位除以16位的除法之前,应先扩展AL或AX中的被除数。
例如,在数据段中,有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段是:
MOVSI,OFFSETARRAYMOVAX,[SI]
CWD
IDIVWORDPTR2[SI]MOV4[SI],AX
MOV6[SI],DX
一般情况下,都将符号数看作补码数,扩展指令和符号整数除法仅对补码数适用。若特别指出该符号数为原码数,则其扩展和除法运算都要另编程序段实现。
BCD数调整指令
第2.3节介绍的加减指令和本节介绍的乘除指令都是对二进制数进行操作。二进制数算术运算指令对
BCD数进行运算,会得到一个非BCD数或不正确的BCD数。如:
00000011B+00001001B=00001100B
00001001B+00000111B=00010000B
第一个结果是非BCD数;第二个结果是不正确的BCD数。其原因是BCD数向高位的进位是逢10进1,而4位二进制数向高位进位是逢16进1,中间相差6。若再加上6,就可以得到正确的BCD数:
00001100B+00000110B=00010010B
00010000B+00000110B=00010110B
8086/8088对BCD数使用二进制数算术运算指令进行运算,然后执行一条能把结果转换成正确的BCD
数的专用调整指令来处理BCD数的结果。
BCD数加法调整指令DAA(decimaladjustforadd)和AAA(ASCIIadjustforadd)
指令格式 DAA
AAA
DAA指令的意义是将AL中的数当作两个压缩BCD数相加之和来进行调整,得到两位压缩BCD数。具体操作是,若(AL0FH)9或AF=1,则AL加上6;若(AL0F0H)90H或CF=1,则AL加60H。如:
MOVAX,3456H
ADDAL,AH ;AL=8AH
DAA ;AL=90H
AAA指令的意义是将AL中的数当作两个非压缩BCD数相加之和进行调整,得到正确的非压缩BCD数送AX。具体操作是,若(AL0FH)9或AF=1,则(AL+6)0FH送AL,AH加1;否则AL0FH送AL,