义隆单片机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)