如果让你用一8位的CPU去做一个能算出上万亿结果的加减乘除计算器程序,你的设计思路是?

来源:百度知道 编辑:UC知道 时间:2024/05/17 01:36:36
我的设计思路是:
加减很简单先不管,关键是乘除。
乘法我会用累加的方法,比如2×6=12,实际上是2+2+2+2+2+2,让被乘数作为计数值(这里是6-1=5),不断的去加乘数结果存放在加数内存里,当5次计满后,把加数内存里的信息输出
除法我会用递减的方法,比如24÷4=6,实际上是24-4-4-4-4-4-4=0,被除数作为被减数,每减一次,程序就把内存A的量加1,并将减数内的当前值与0比较,不为0继续减,为0则输出内存A的结果,这里加了6次

我现在出现的问题是,先说明一下,我是用MCS-51单片机做的,在ISIS 7 Professional(Proteus 7 Professional)程序上模拟的,数码管12个,最高能计算到1万亿-1这样的规模,运算加减,速度很快,运算乘除时就有问题了,比如像123456×123(被乘数位数小的)运算很快,但是像123456×12345(被乘数位数高的)运算的就很慢,因为要累加12345次,当按下=号时,要等较长时间,数码管才会显示计算结果,除法也是一样,比如12345678÷12345678,相当于12345678-12345678.只要1次,当被除数越小,比如12345678÷2,相当于12345678-2-2-2……一直减到0,要减6172839次,是不是乘除运算我用累加和递减的的思路去做,在执行这类计算时不好,那一般人家是怎么用8位的单片机来做乘除呢?

乘法思路 双字节乘法 也还是用单字节乘法指令完成
如果要再推广到更多字节,有必要用工具建立一个数学模型。

思路R2R3*R6R7=[R2*R3]*2^16+[R2*R7+R3+R6]*2^8+R3*R7

;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节

MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET

真是麻烦,本来还以为外面卖的十二块一个的计算机贵了,现在自己遇到问题的时候,才知道真不简单,实际的工程里,会遇到许多意想不到的问题。

用数组做