[汇编]压缩BCD码的乘除法算法

[汇编]压缩BCD码的乘除法算法,第1张

把压缩BCD码转换成二进制数再进行乘除运算,把结果转换回压缩BCD码就是了

不进行数制转换,就用压缩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 SEGMENT

DATA1 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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12087704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存