资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,5.1,两个多字节数的加减运算,这里所指的两个多字节数的加减运算,包括二进制数的加减运算和组合的,BCD,数加减运算,由于,8088,内部寄存器是,16,位的,因此不能直接进行多字节数的加减运算。,高位加法指令应采用,ADC,指令;减法指令应采用,SBB,指令。,第,5,章 数值运算程序设计,1.,两个多字节数的二进制加法运算,例,5.1,设多字节的被加数从,FIRST,单元开始存放,多字节的加数从,SECOND,单元开始存放,相加后的结果从,DEST,单元开始存放,设字节数为,5,。则程序如下:,NAME EX,05,1,;MULTIPLE BYTES-ADDITION,DATA SEGMENT,FIRST DB 1AH,25H,4EH,60H,3DH,SECOND DB 80H,49H,62H,AEH,4EH,DEST DB 5 DUP(?),DATA ENDS,COSEG SEGMENT,ASSUME CS:COSEG,DS:DATA,ES:DATA,START:,MOV AX,DATA,MOV DS,AX,MOV ES,AX,MOV SI,OFFSET FIRST,MOV BX,OFFSET SECOND,MOV DI,OFFSET DEST,MOV CX,LENGTH DEST,CLD,CLC,ADDHEX:,LODSB FIRST,ADC AL,BX,STOSB DEST,INC BX,LOOP ADDHEX,MOV AH,4CH,INT 21H,COSEG ENDS,END START,5.2,多字节乘法运算,设有两个,32,位二进制数,相乘的结果将是一个,64,位范围内的二进制数。如果将一个乘数分为两个字,被乘数也分为两个字,分别按字进行相乘。例如被乘数的两个字分别为,X,1,和,X,0,乘数的两个字分别为,Y,和,Y,0,,则:,Y=(Y,1,)(Y,0,)=(Y,1,)*2,16,+(Y,0,),X=(X,1,)(X,0,)=(X,1,)*2,16,+(X0),X*Y=(Y,1,)*2,16,+(Y,0,)*(X,1,)*2,16,+(X,0,),=(Y,1,)*(X,1,)*2,32,+(Y,1,)*(X,0,)*2,16,+,(Y,0,)*(X,1,)*2,16,+(Y,0,)*(X,0,),例,5.2,两个,32,位数分别为,X,和,Y,,乘积放在,RESULT,开始的四个字中,低位字节放在低地址中。程序如下:,;,NAME EX,05,2,DATA SEGMENT,X DD 12345678H;32,位被乘数,Y DD 567890ABH;32,位乘数,RESULT DW 4 DUP(0),DATA ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,START:,MOV AX,DATA,MOV DS,AX,MOV SI,OFFSET RESULT,MOV AX,WORD PTR X,MOV CX,WORD PTR Y,MUL CX,MOV SI,AX,MOV SI+2,DX,MOV AX,WORD PTR X,MOV CX,WORD PTR Y+2,MUL CX,ADD SI+2,AX,ADC WORD PTR,SI+4,DX,MOV AX,WORD PTR X+2,MOV CX,WORD PTR Y,MUL CX,ADD SI+2,AX,ADC SI+4,DX,ADC WORD PTR,SI+6,0,MOV AX,WORD PTR X+2,MOV CX,WORD PTR Y+2,MUL CX,ADD SI+4,AX,ADC SI+6,DX,MOV AH,4CH,INT 21H,CODE ENDS,END START,以上程序很容易看懂,在进行加法时,,2,16,和,2,32,只要分别位移一个字或两个字再进行加法即可。,相对,SI,SI+2,为高位字;而,SI+4,和,SI+6,又是,SI,字的更高一位字或两位字。,当,ADC,指令加一个立即数,0,时,由于没声明是字节,0,还是字,0,,所以,WORD PTR,不能省去,否则就会在汇编时出错。,程序分析:,5.3,多字节除法,设有一个,64,位数除,16,位数,则商可能仍是,64,位,而余数为,16,位。若用一般的除法,则很难进行处理。如果用被除数连续减去除数得到商,很可能要减亿万次,计算机将用很长时间才能完成这么大的运算量。,如果在进行最高位除法时,高,16,位被除数为,0,,然后将被除数最高,16,位送,AX,,除数放在,CX,中,这样,除法肯定不会产生溢出。第一次除法后的余数放在,DX,中,作为第二次除法的高,16,位,将下一个被除数,16,位送,AX,,再进行除法,用这种方法,可以顺利地完成整个除法运算。,例,5.3,设被除数为,8,个字节的,X,,而除数为两个字节的,Y,,商放在,RESULT,中,仍采取高字节放在高地址,余数放在,EXTRA,中。程序如下:,;,NAME EX,05,3,DATA SEGMENT,X DQ 1234567890ABCDEFH,Y DW 1234H,RESULT DW 4 DUP(0),EXTRA DW 0,DATA ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,START:,MOV AX,DATA,MOV DS,AX,MOV CX,Y,MOV DX,0,MOV AX,WORD PTR X+6,DIV CX,MOV WORD PTR RESULT+6,AX,MOV AX,WORD PTR X+4,DIV CX,MOV WORD PTR RESULT+4,AX,MOV AX,WORD PTR X+2,DIV CX,MOV WORD PTR RESULT+2,AX,MOV AX,WORD PTR X,DIV CX,MOV WORD PTR RESULT,AX,MOV EXTRA,DX,MOV AH,4CH,INT 21H,CODE ENDS,END START,5.4 BCD,数的算术运算,8088,指令系统提供了若干条,BCD,调整指令,但这些指令只能对用,BCD,码表示的一位或两位十进制数操作,范围狭小。,对多字节的,BCD,码进行运算就要用大量的调整指令,尤其是乘法,所费的时间是二进制运算的数倍。,一般情况下对,BCD,数的运算,先转换为二进制数,然后进行相应的二进制运算,若运算结果要求以十进制,BCD,输出或,BCD,的,ASCII,输出,可以再次运用代码转换的方法来实现。,对于多字节压缩型的十进制加法和减法,已在例,5.1,和,5.2,中介绍过。下面对非压缩型的十进制数运算再举几个例子。,1.,多字节非压缩型十进制数加法,例,5.7,设在存储单元,A,、,B,分别有,10,个非压缩,BCD,数,相加后的结果放在,C,单元开始的,11,个单元中,低位字节从低地址存放。程序如下:,;NAME EX,05,6,DATA SEGMENT,A DB 1,2,3,4,5,6,7,9,8,4,B DB 8,9,7,6,5,4,8,7,6,5,C DB 11 DUP(0),DATA ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,ES:DATA,START:,MOV AX,DATA,MOV DS,AX,MOV ES,AX,CLD,CLC,MOV SI,OFFSET A,MOV BX,OFFSET B,MOV DI,OFFSET C,MOV CX,10,AGAIN:,LODSB,ADC AL,BX,AAA ;,STOSB,INC BX,LOOP AGAIN,ADC BYTE PTR,DI,0,MOV AH,4CH,INT 21H,CODE ENDS,END START,对于非压缩型多字节的,BCD,数减法,也可对上述程序稍加改动来实现。若被减数为,A,,减数为,B,,结果送,C,,则将上述程序中的,ADC,指令改为,SBB,指令,,AAA,指令改为,AAS,指令,在,A,大于,B,的情况下,还可将循环后的一条指令,ADC,删去。,2.,非压缩型十进制数相乘,例,5.7,设被乘数从,A,单元开始存放,乘数为一位非压缩型,BCD,数,存于,B,单元,相乘后的十进制结果从,C,单元开始存放,仍为非压缩型的,BCD,数。,分析:乘法十进制调整指令,AAM,完成如下操作:首先将,AX,中的乘积分解为两位,BCD,数,低位存在,AL,中,高位送,AH,。在进行高一位的乘法时,应将调整后的低位,BCD,数与上一次乘法中的高位,BCD,相加。,由于相加后,可能有进位或需要进行加,6,修正,这时应加一条,AAA,调整指令。这两次,BCD,调整,都可能影响,AH,,所以,AH,应在两次,BCD,的调整后再保存。程序如下:,;,NAME EX,05,7,DATA SEGMENT,A DB 2,6,3,7,5,N EQU$-A,B DB 6,C DB N+1 DUP(?),DATA ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,ES:DATA,START:,MOV AX,DATA,MOV DS,AX,MOV ES,AX,CLD,LEA SI,A,LEA DI,C,MOV CX,N,MOV BYTE PTR,DI,0,AGAIN:,LODSB,MUL B,AAM,ADD AL,DI,;,加低位乘积的高位,AAA,STOSB ;,执行后,DI,将自增,MOV,DI,AH,LOOP AGAIN,MOV AH,4CH,INT 21H,CODE ENDS,END START,它与多字节,BCD,加法相类似,将最低位乘积置成,0,,就如同,BCD,加法中的,CLC,指令的作用,即把最初低位乘积的高位置成,0,。,STOSB,指令将乘积的低位,BCD,存于本位的乘积单元,而,DI,指向下一个单元,用来存放,AH,中的乘积的高位,BCD,数。,3.,两个多位十进制数相乘,例,5.8,有两个,BCD,数为,345*789,,设乘积为,Z,,则有:,Z=345*7*10,2,+345*8*10+345*9,Z=A*100+B*10+C,其中,A,、,B,、,C,均可由多位,BCD,与一位,BCD,相乘来实现,相加则可通过,B,左移一个字节,,A,左移两个字节相加实现。程序如下:,;NAME EX,05,8,DATA SEGMENT,A DB 5,4,3 ;,被乘数为,345,B DB 9,8,7 ;,乘数为,789,C DB 6 DUP(0);,部分积中间结果,D DB 6 DUP(0);,乘积的结果单元,N1 EQU 3 ;,按位乘计数器,N2 EQU 6 ;,按位加计数器,COUNT DB 3,DATA ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,ES:DATA,START:,MOV AX,DATA,MOV DS,AX,MOV ES,AX,MOV SI,OFFSET A,MOV BX,OFFSET B,MOV DI,OFFSET C,MOV CX,N1,AGAIN:,PUSH BX,PUSH CX,PUSH DI,CLD,MOV DI,OFFSET C,MOV CX,N2,CLEAR:,MOV BYTE PTR,DI,0 ;,清中间区,INC DI,LOOP CLEAR,POP DI ;,指向本次部分积低位,POP CX,MOV SI,OFFSET A,PUSH CX,PUSH DI,CALL SM ;,进行十进制乘法,MOV SI,OFFSET C,MOV DI,OFFSET D,MOV CX,N2,CLC,CALL SA ;,加本次部分积,POP CX,POP DI,POP BX,INC DI ;,指向乘积的高一位,INC BX ;,指向乘数的高一位,DEC COUNT ;,乘数
展开阅读全文