不进行数制转换,就用压缩BCD硬算,多字节无符号的...
你是要进行大数运算吧,先设计一个BCD格式,比如最多十位,二十位什么的,这样才能通用于所有的BCD运算,不然你BCD长度不一样程序就不通用了。
设计好BCD长度后,就模拟人工手算方式进行运算,你有一个1#数据定义和一个2#数据定义,以及一个3#数据定义存放结果。每个数据都是压缩BCD方式定义的多字节
乘:
取2#数最末位,与1#数最末位相乘,这得用MUL指令(完全杜绝二进制指令那你就累加),转换成BCD格式,结果放在3#数据里,然后与1#倒数第二位进行乘法运算,转换成BCD格式,结果与3#数据移位累加(你得设计出BCD格式的加法),一直到1#数据的所有位完成为止(也可以以1#数据位出现0为终止条件)
2#数最末位完成后,进行2#数的其它位乘法,具体与最末位过程是一样的。当所有位运算完后,3#结果存放的就是符合你要求的BCD格式的数据了。
除:
你得设计出BCD相减算法,用1#数据减2#数据,直到不够减为止,那时的减的次数是商,余下的就是余数了。
综上所述,要完成大数BCD码的乘除运算,没有相应的加减算法支持是不行的,因为按你的意思大数可能超出了32位(8086汇编还只是16位),也就是说,大于65535的BCD码相加你不能依靠机器自有加法指令,只好自己设计相关算法了。
具体加减方式也差不多,和手工相似:
加:
从最末位到第一位,提取各自的BCD码值进行数据相加,加的过程中你要处理进位情况
减:
从最末位到第一位,提取各自的BCD码值进行数据相减,减的过程中你要处理借位情况
当然,具体到编程中去可能没有说的这么简单,这只是个过程描述而已。
以前有本书好像是叫《80386协处理器数值编程》,时间太长了,除当时外也没再关注此书,所以不敢肯定,那上面就有BCD码+-*/的算法,好像也就十来位。你能找到最好,找不到我也没办法,那书早搞丢了。
还有个完成此类问题的思路,当然它也有局限性,那就是用浮点指令来进行运算,它的表示范围是计算机当前所能表示的最大范围,你设计一个浮点数与BCD码也好,二进制也好它们之间的双向转换算法,然后借用浮点指令进行运算,结果再转换回来,那本书也有此代码,不过很可惜,这点我帮不上你,而且可以告诉你,无论那种方法,汇编代码都不短
DATA SEGMENTDATA1 DB'Please input a double-digit to A:$'
DATA2 DB'Please input a double-digit to B:$'
DATA3 DB'result:A*B=$'
DATA4 DB'This program realization two double-digit multiplication and display the result.$'
A DB6,?,6 DUP(00H)
B DB6,?,6 DUP(00H)
RESULT DB4 DUP(00H)
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
BEGIN: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET DATA4
MOV AH,9H
INT 21H
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
MOV DX,OFFSET DATA1
MOV AH,9H
INT 21H
MOV DX,OFFSET A
MOV AH,0AH
INT 21H
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
MOV DX,OFFSET DATA2
MOV AH,9H
INT 21H
MOV DX,OFFSET B
MOV AH,0AH
INT 21H
MOV AX,0
MOV SI,OFFSET B+3
MOV BL,[SI]
AND BL,00001111B
MOV SI,OFFSET A+3
MOV DI,OFFSET RESULT
MOV CX,2
LOOP1: MOV AL,[SI]
AND AL,00001111B
DEC SI
MUL BL
AAM
ADD AL,[DI]
AAA
MOV [DI],AL
INC DI
MOV [DI],AH
LOOP LOOP1
MOV AX,0
MOV SI,OFFSET B+2
MOV BL,[SI]
AND BL,00001111B
MOV SI,OFFSET A+3
MOV DI,OFFSET RESULT+1
MOV CX,2
MOV DL,0
LOOP2: MOV AL,[SI]
AND AL,00001111B
DEC SI
MUL BL
AAM
ADD AL,[DI]
AAA
ADD AL,DL
AAA
MOV [DI],AL
INC DI
MOV DL,AH
LOOP LOOP2
MOV [DI],AH
MOV AX,0
MOV SI,OFFSET RESULT+3
MOV CX,4
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
MOV DX,OFFSET DATA3
MOV AH,9H
INT 21H
DISPL: MOV AH,2
MOV DL,[SI]
ADD DL,30H
INT 21H
DEC SI
LOOP DISPL
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)