51单片机二进制除法 (汇编语言程序)

51单片机二进制除法 (汇编语言程序),第1张

汇编中的2进制庆悄在数值结尾加“b”

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%。


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

原文地址:https://54852.com/yw/12229812.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存