义隆循环左移c语言,义隆单片机EM78PXXX的乘除的运算法

义隆单片机EM78PXXX的乘除的运算法

分类:单片机类2006/04/29 15:15

EM78PXXX的乘除的运算法:

一二进制数转换为ASCⅡ码

将一个字节的二进制数转换为两位16进制数的ASCⅡ码

main:mova,@0x9f;二进制数为0x9f

mov0x30,a;二进制数存入0x30

mova,@0x02

mov0x10,a;0x10中存放转换次数

mova,@0x31

mov0x04,a;0x04中为转换后数据存放地址

mova,0x30

B1:anda,@0x0f;取a低4位

mov0x00,a

suba,@0x09;低4位大于9跳往B2

jbs0x03,0

jmpB2

mova,0x00;低4位不大于9则加0x30

adda,@0x30

mov0x00,a;将ASCⅡ码存入0X04所指单元

jmpB3

B2:mova,0x00;大于9则加0X37

adda,@0x37

mov0x00,a

B3:swapa0x30;将0X30高4位换入A低4位

inc0x04;存储地址加1

djz0x10;循环次数减1,为0则返回

jmpB1;不为0继续转换

self:jmpself

eop

二多字节二进制加法

0X20,0X21中的二进制无符号数与0X22,0X23中的二进制无符号数相加,结果放在0X24,0X25,0X26中,低地址中放低字节数据.

Main:mov a,@0x78;赋值

mov0x20,a

mova,@0xc6

mov0x21,a

mova,@0x86

mov0x22,a

mova,@0x9e

mov0x23,a

mova,@0x0;0x26单元清0

mov0x26,a

mova,0x21

adda,0x23

mov0x25,a;高字节相加,结果送0x25

jbc0x03,0

inc0x26; 有进位则0x26加1

mova,0x20

adda,0x22

mov0x24,a;低字节相加,结果送0x24

jbs0x03,0

jmp self;无进位跳self

inc0x25;有进位0x25加1

jbc0x03,0

inc0x26; 有进位0x26加1

self:jmpself

eop

三多字节二进制减法

0x20,0x21中的二进制无符号数减0x22,0x23中的二进制无符号数, 低地址中放低字节数据.假设被减数大于减数.

注意:(1)sub指令减出结果为正时,c标志置1.

(2)sub指令减出结果为0时,c标志也置1.

即,sub指令执行后,c标志清0表示结果为负.

main:mova,@0x67;赋值

mov0x20,a

mova,@0xff

mov0x21,a

mova,@0xe8

mov0x22,a

mova,@0x44

mov0x23,a; 高字节相减

suba,0x21

mov0x25,a;结果存0x25

mova,0x22;低字节相减

suba,0x20

mov0x24,a

jbs0x03,0

dec0x25;有借位则0x25减1

self:jmpself

eop

四二进制乘法运算

EM78单片机没有乘法指令,所以乘法运算需要转化为加法运算.0X20单元数据乘以0X21单元数据,结果放在0X22,0X23中.

main:mova,@0x0;0x22,0x23单元清0

mov0x22,a

mov0x23,a

mova,@0x3f;赋值

mov0x20,a

mova,@0x22

mov0x21,a

mul1:mova,0x20;0x20与0x22内容相加

add0x22,a

jbc0x03,0

inc0x23;有进位0x23加1

djz0x21;0x21中次数减到0则结束

jmpmul1;没减到0则继续

self:jmpself

eop

五二进制除法运算

多字节二进制除法

被除数为3个字节,在0x20、0x21、0x22单元中,0x22.7为最高位,0x20.0为最低位.

除数为2个字节,在0x30、0x31中.

算法:EM78单片机没有除法指令,而且本例中除法为多字节除法,可采用如下算法.

将被除数扩充一个字节0X23,0X23清0.被除数左移1位,0X23、0X22中数据减去0X31、0X30中数据,够减则减且0X20.0置1,减出结果存入0X23、0X22;不够减则0X23、0X22保持不变,0X20.0清0.然后被除数再左移1位,重复上述过程.共循环16次,最后0X23、0X22中得相减余数,0X21、0X20中得商.注意,若被除数左移后C标志为1,则不比较0X23、0X22与0X31、0X30数据大小关系而直接相减.

main:mova,@0x55;被除数赋值

mov0x20,a

mov0x21,a

mov0x22,a

mova,@0x0;被除数扩充1字节并清0

mov0x23,a

mova,@0x12;除数赋值

mov0x30,a

mov0x31,a

mova,@0x10;循环次数为16

mov0x32,a

again:callrt_sub;调移位除法子程

djz0x32;16次循环完成则结束

jmpagain;未完成则继续

self:jmpself

rt_sub:

bc0x03,0;c标志清0

rlc0x20;被除数左移1位

rlc0x21

rlc0x22

rlc0x23

jbc0x03,0

jmprt3;c标志为1则直接相减

mova,0x23;c标志为0则先比较大小

mov0x25,a

mova,0x22

mov0x24,a

mova,0x31;先比较高位

sub0x25,a

jbc0x03,2

jmprt1;高位相等跳rt1比较低位

jmprt2;高位不等跳rt2

rt1:mova,0x30;比较低位

sub0x24,a

jbc0x03,2

jmprt3;低位也相等则跳rt3,相减,上1

rt2:jbs0x03,0

ret;减数大则返回,减数小则相减,上1

rt3:bs0x20,0;上1

callsub_2b;调2字节减法子程

ret

sub_2b:

mova,0x31;高字节相减

sub0x23,a

mova,0x30;低字节相减

sub 0x22,a

jbc0x03,2

ret;低字节相等,无借位,返回

jbc0x03,0

ret;无借位,返回

dec0x23;低字节相减有借位,高字节结果减1

ret

eop

六BCD数转换为二进制数

两字节压缩BCD码转换为两字节二进制数.算法如下:

BCD码abcd=1000a+100b+10c+d=10{10[10a+b]+c}+d,将各位BCD码分离出之后,即可根据此式转换为二进制数.涉及到乘法运算和多字节加法运算.

0X20,0X21中为BCD码,0X21高4位为最高位.转换结果放在0X30,0X31中.

main:mova,@0x79

mov0x20,a

mova,@0x54

mov0x21,a;赋值

mova,0x20

anda,@0x0f

mov0x22,a

swapa0x20

anda,@0x0f

mov0x23,a

mova,0x21

anda,@0x0f

mov0x24,a

swapa0x21

anda,@0x0f

mov0x25,a;BCD码展开后存于0X22,0X23,0X24,0X25

mova,0x25,;0X25为最高位

mov0x30,a

mova,@0x0;多字节加法高位为0

mov0x31,a

mova,0x24

mov0x32,a

calla_b;调子程

mova,0x23

mov0x32,a

calla_b

mova,0x22

mov0x32,a

calla_b

self:jmpself

a_b:

mova,@0x0;0X34,0X35存储中间结果

mov0x34,a

mov0x35,a

mova,@0x0a;实现乘10

mov0x33,a

a1:mova,0x35;两字节二进制加法,在本例中高字节肯定无进位

adda,0x31

mov0x35,a

mova,0x34

adda,0x30

mov0x34,a

jbc0x03,0

inc0x35

djz0x33

jmpa1

mova,0x32

add0x34,a

jbc0x03,0

inc0x35

mova,0x34

mov0x30,a

mova,0x35

mov0x31,a

ret

eop

七二进制数转换为BCD码

本例为单字节二进制数(0X20)转换为非压缩BCD码,存在0X25,0X24,0X23中,0X25为百位,0X23为个位.

main:mova,@0xa4;赋值

mov0x20,a

mov0x21,a

mov0x22,a

mova,@0x0;0x23,0x24,0x25单元清0

mov0x23,a

mov0x24,a

mov0x25,a

mova,@0x64;对100的个数计数

mov0x26,a

mova,@0x25;百位存在0x25中

mov0x04,a

calla0;调计数子程

mova,@0x0a;对10的个数计数

mov0x26,a

dec0x04;个位存在0x24中

calla0

mova,0x22;除去百位,十位,余下的即个位,存入0x23

mov0x23,a

self:jmpself

a0:;计数子程

mova,0x26

sub0x22,a

jbs0x03,2

jmpa1

inc0x00;无余数则对应位加1

mova,@0x0;0x21与0x22在返回时应保持相同

mov0x21,a

ret

a1:jbs0x03,0;小于则跳a2

jmpa2

inc0x00;大于则计数值加1

mova,0x22

mov0x21,a;将0x22保存到0x21中

jmpa0;跳回a0继续计数

a2:mova,0x21;0x21中保存的减之前的数据,此时恢复到0x22

mov0x22,a

ret

eop

阅读 (912) |

收藏 (0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值