
10进制誉差渣在结尾加“d”(有的编译器不加字母默认为十进制)
16进制在结尾加“h”(有的编译器不加字庆芦母默认为十六进制,如windows里面的debug程序)
用单片机实现多字节除法一般采用部分余数左移算法,程序已经给你编好了,和你的要求稍微有点不同,执行完后商存储在原来被除数的位置,即53H52H51H50H。这是部分余数左移算法的特点决定的,同时也可以节省内存,如果一定要将商存储到77H76H75H74H只需要在返回指令RET前增加4条传送指令即可:MOV77H,53H
MOV76H,52H
MOV75H,51H
MOV74H,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
如果你的精度不是特别高,有个很简芦橡卖单的如绝办法,就是直接将陪逗20H当做结果。原因是除以255近似为除以256,这就相当于将这两个字节右移八位,结果就是
原先的20H的内容。这样的精度与准确值相差0.5%。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)