文档详情

微机原理第三章.docx

发布:2024-07-31约6.92万字共73页下载文档
文本预览下载声明

可用除法运算将二进制数转换为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,

显示全部
相似文档