就比如电子表秒数计算到25,想把25分成2和5分别查表就可以显示出来,这个小程序用汇编应该怎么写呢?PS:老师就让我用汇编编程序,真的头都大了。
老师给了我一个下面的程序,但是我实在是看不明白,求大神帮忙解读一下:
;将100以内二进制数转化为ASC码
l_str2_zcx
swpb r15
clr r14
mov #8,r13
l_str2_loop
rlc r15
dadd.b r14,r14
dec r13
jnz l_str2_loop
mov.b r14,r15
and.b #00fh,r15
rla r14
rla r14
rla r14
rla r14
swpb r14
and.b #00fh,r14
add.b #30h,r15
add.b #30h,r14
ret
此帖出自
小平头技术问答
这个问题吗,首先要非常清楚这个过程,然后我们再来解读汇编。
拿到2位十进制数,首先拆成十位和个位的两个部分,无论是个位还是10位,都是{0,1,2,3,4,5,6,7,8,9}这个集合中的一个
接下来的过程,对十位数和个位数都是一样的。那就是,既然这个数小于10,那么用它直接加上数字0的ASCII码,例如5,5+【0的ASCII码】=【5的ASCII码】,就得到了它的ASCII码啦,0的ASCII码是多少呢,是0x30
- ;将100以内二进制数转化为ASC码
- l_str2_zcx
- swpb r15 ;r15中保存这原数, 把r15的高低字节互换, 目的是把二进制搞到高字节里去
- clr r14 ;清r14的值为0
- mov #8,r13 ;设成8, 这个将来用于移位r15中的高字节
- l_str2_loop
- rlc r15 ;左移r15到C, 这是最高字节的最高位
- dadd.b r14,r14 ;利用十进制加法把刚才移出来的C加上r14, 一起再加到r14, 相当于r14 * 2 + C
- dec r13 ;移位计数减1
- jnz l_str2_loop ; 注意这个循环结束之后, r14就应该是原来r15中那个数的十进制表示啦, 0~3位是个位, 4~7位是十位
- mov.b r14,r15 ;复制出来给r15一份
- and.b #00fh,r15 ;r15 保留个位部分, 即0~3位
- rla r14 ;r14 左移4位, 之后十位部分就搞到高字节中去了
- rla r14
- rla r14
- rla r14
- swpb r14 ;交换r14的高低字节, 结果十位就回到r14的低字节的0~3位
- and.b #00fh,r14 ;保险式的只保留r14的0~3位, 这个和r15不一样, 这个里的十进制数是原数的十位部分
- add.b #30h,r15 ;加上0x30, 变为ASCII码
- add.b #30h,r14 ;加上0x30, 变为ASCII码
- ret
复制代码哇,非常感谢你啊!讲的这么详细,我现在处于很低级的起步阶段,方便留个QQ么,想跟您学习学习汇编和430
你要的东西已经论坛留言告诉你了。
一周热门 更多>