单片机高手,请帮个忙,看下这段程序的原理是什么

用移位指令求两数的商,看不懂得原理,单片机老师只说了三个字‘不知道’
题目出自北航单片机原理及接口技术,李朝青版。102页,麻烦解释一下其数学原理,谢谢啦

题目:编写双字节除法(16位除八位)
解:将被子除数放于(R6)(R5)中,除数放于(R4)中。在程序运行中,(R5)保存被除数低们和商,(R6)保存余数,设07H存放中间标志位,程序执行完后,(R5)为商,(R6)为余数,其程序如下:
DV:MOV R7,#08H
S0:CLR C
MOV A ,R5
RLC A
MOV R5,A
MOV A ,R6
RLC A
MOV 07H,C
CLR C
SUBB A, R4
JB 07H,S1
JNC S1
ADD A,R4
SJMP S2
S1:INC R5
S2:MOV R6,A
DJNZ R7,S0
RET

可以仿照十进制的除法来理解。只不过商的每一位只是0或1,也就是说先用高位的被除数减去除数,结果只有两种:1,高位大于被除数(商1);2,高位小于被除数(商0).没有十进制那麽多的情况,所以每往左移一位都可以直接用减法。
而上面的算法只不过是通过移位把商放在R5的后面了,左移八次后正好商全部都在R5中,而余数都移到R6中了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-06-09
老师说不知道是他不想看这个程序,又或者他不懂除法的算法,

这是一个除法算法,该程序是一个用累减的方法求商的.

程序好象好复杂是因为它的商,余数要放回被除数的位置上,要做变换.
第2个回答  2009-06-09
DV:MOV R7,#08H;将08存到R7
S0:CLR C ;进位清0
MOV A ,R5;将R5送到累加器
RLC A ;把R5中的数左移一位
MOV R5,A 把左移后得到的数送回R5
MOV A ,R6 ;把R6中的数送累加器
RLC A ;将R6中的数左移一位
MOV 07H,C; 把进位送到07H这个地址
CLR C ;进位清0
SUBB A, R4 ;将A中的数减去R4中的数并结果送A
JB 07H,S1 ;判断A中的数是否小于07H中的数,即判断是否有进位;若无进位,转到S1
JNC S1
ADD A,R4 ;将A中的数与R4中的数相加,结果放到中
SJMP S2 若有直位,转到S2;
S1:INC R5
S2:MOV R6,A
DJNZ R7,S0
RET
自己对着上边的解说算一下,你就会知道客观存在的原理了
相似回答