51单片机除法 运算 汇编语言程序,被除数53H52H51H50H,除数43H42H41H40H。然后输出结果在70H~77H中,急求

如题所述

用单片机实现多字节除法一般采用部分余数左移算法,程序已经给你编好了,和你的要求稍微有点不同,执行完后商存储在原来被除数的位置,即53H52H51H50H。这是部分余数左移算法的特点决定的,同时也可以节省内存,如果一定要将商存储到77H76H75H74H只需要在返回指令RET前增加4条传送指令即可:
MOV 77H,53H
MOV 76H,52H
MOV 75H,51H
MOV 74H,50H
关于部分余数左移算法的工作原理其实和我们列竖式做除法是一样的,按照从高到低一位一位的取被除数和除数比较,不同的是十进制除法每位相除的结果有0~9十种可能,而二进制则只有0和1两种情况,那么一开始将余数存储单元全部清零,然后余数和被除数一起左移一位,就取得了被除数的最高位到余数存储单元中,这时将余数(也就是被除数的最高位)和除数比较,小于上0,大于则上1,然后再移位,根据被除数的位数循环32次即可完成除法运算。具体过程你可以通过一个实例自己推算一下,程序就很容易看懂了。

;******************************************************************
;51单片机除法 运算 汇编语言程序
;采用部分余数左移算法
;被除数,商: 53H52H51H50H
;除数: 43H42H41H40H
;余数: 73H72H71H70H
;减法结果暂存:57H56H55H54H
;******************************************************************
DIVIDE:
MOV 70H,#00H ;余数存储单元清零
MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV R3,#32 ;循环次数,被除数总共32位

DIVLP0: CLR C ;余数和被除数一起左移一位
MOV A,50H
RLC A
MOV 50H,A
MOV A,51H
RLC A
MOV 51H,A
MOV A,52H
RLC A
MOV 52H,A
MOV A,53H
RLC A
MOV 53H,A
MOV A,70H
RLC A
MOV 70H,A
MOV A,71H
RLC A
MOV 71H,A
MOV A,72H
RLC A
MOV 72H,A
MOV A,73H
RLC A
MOV 73H,A

DIVSUB: CLR C ;做减法,余数-除数
MOV A,70H ;73H72H71H70H-43H42H41H40H->57H56H55H54H
SUBB A,40H
MOV 54H,A
MOV A,71H
SUBB A,41H
MOV 55H,A
MOV A,72H
SUBB A,42H
MOV 56H,A
MOV A,73H
SUBB A,43H
MOV 57H,A

JC DIV2 ;如果余数比除数小,则上0(这一步在移位时已经完成了)

INC 50H ;否则上1
MOV 73H,57H ;并更新余数
MOV 72H,56H
MOV 71H,55H
MOV 70H,54H

DIV2: DJNZ R3,DIVLP0 ;循环32次?
RET追问

不可以啊,53H千位,是不是反了

追答

你的意思是53H52H51H50H分别是被除数的千百十个位?43H42H41H40H是除数的千百十个位?BCD码数?那就比较麻烦了。多字节除法必须是用二进制计算的,具体程序我就不写了,方法如下:
1. 将被除数,除数转换为二进制数。
2. 用部分余数左移算法计算除法。(参考上面的程序)
3. 将结果(二进制)再转换为十进制数。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-23
看看这个程序,稍加修改就可以了
http://www.go-gddq.com/html/51DanPianJi/2011-02/552692.htm
相似回答