汇编语言1数值运算程序设计
; 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 MOV MOV MOV MUL MOV MOV MOV MOV MUL ADD ADC MOV
5.3 多字节除法
设有一个64位数除16位数,则商可能仍是64位, 而余数为16位。 若用一般的除法,则很难进行 处理。 如果用被除数连续减去除数得到商,很 可能要减亿万次,计算机将用很长时间才能完成 这么大的运算量。
如果在进行最高位除法时,高16位被除数为0, 然后将被除数最高16位送AX,除数放在CX中, 这样, 除法肯定不会产生溢出。第一次除法后 的余数放在DX中, 作为第二次除法的高16位, 将下一个被除数16位送AX, 再进行除法, 用这 种方法,可以顺利地完成整个除法运算。
ADDHEX: LODSB ADC STOSB INC LOOP MOV INT
COSEG END
FIRST AL, [BX]
DEST BX ADDHEX AH, 4CH 21H ENDS START
5.2 多字节乘法运算 设有两个32位二进制数, 相乘的结果将是一 个64位范围内的二进制数。 如果将一个乘数分 为两个字, 被乘数也分为两个字, 分别按字进 行相乘。 例如被乘数的两个字分别为X1和X0, 乘数的两个字分别为Y1和Y0, 则:
DS, AX SI, OFFSET RESULT AX, WORD PTR X CX, WORD PTR Y CX [SI], AX [SI+2], DX AX, WORD PTR X CX, WORD PTR Y+2 CX [SI+2], AX WORD PTR[SI+4], DX AX, WORD PTR X+2
MOV CX, WORD PTR Y
MUL CX
ADD [SI+2], AX
ADC [SI+4], DX
ADC WORD PTRRD PTR X+2
MOV CX, WORD PTR Y+2
MUL CX
ADD [SI+4], AX
ADC [SI+6], DX
MOV AH, 4CH
例5.1 设多字节的被加数从FIRST单元开始存放, 多 字节的加数从SECOND单元开始存放, 相加后的 结果从DEST单元开始存放, 设字节数为5。 则程 序如下:
NAME EX—05—1
; MULTIPLE BYTES-ADDITION
DATA
SEGMENT
FIRST
DB 1AH, 25H, 4EH, 60H, 3DH
INT
21H
CODE ENDS
END START
程序分析:
以上程序很容易看懂, 在进行加法时, 216和 232只要分别位移一个字或两个字再进行加法即 可。
相对[SI], [SI+2]为高位字; 而[SI+4] 和[SI+6]又是[SI]字的更高一位字或两位 字。
当ADC指令加一个立即数0时, 由于没声明是 字节0还是字0, 所以′WORD PTR′不能省去, 否则就会在汇编时出错。
5.4 BCD数的算术运算 8088指令系统提供了若干条BCD调整指令, 但这些指令只能对用BCD码表示的一位或两位 十进制数操作,范围狭小。
例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
第5章 数值运算程序设计
5.1 两个多字节数的加减运算
这里所指的两个多字节数的加减运算, 包括 二进制数的加减运算和组合的BCD数加减运算
由于8088内部寄存器是16位的, 因此不能直 接进行多字节数的加减运算。
高位加法指令应采用ADC指令; 减法指令应 采用SBB指令。
1. 两个多字节数的二进制加法运算
DATA
ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV MOV MOV MOV MOV DIV MOV MOV DIV MOV
AX, DATA DS, AX CX, Y DX, 0 AX, WORD PTR X+6 CX WORD PTR RESULT+6, AX AX, WORD PTR X+4 CX WORD PTR RESULT+4, AX
MOV DIV MOV MOV DIV MOV MOV MOV INT CODE END
AX, WORD PTR X+2 CX WORD PTR RESULT+2, AX AX, WORD PTR X CX WORD PTR RESULT, AX EXTRA, DX AH, 4CH 21H ENDS START
Y=(Y1)(Y0)=(Y1)*216+(Y0) X=(X1)(X0)=(X1)*216+(X0) X*Y=((Y1)*216+(Y0))*((X1)*216+(X0))
=(Y1)*(X1)*232+(Y1)*(X0)*216+ (Y0)*(X1)*216+(Y0)*(X0)
例 5.2 两 个 32 位 数 分 别 为 X 和 Y , 乘 积 放 在 RESULT开始的四个字中, 低位字节放在低地 址中。 程序如下:
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