用汇编语言列出8位二进制数表示的十进制数的个十百位。此单片机汇编指令无乘除和取余。

如题所述

;
    MOV  30H, #255   ;百位
    MOV  31H, #255   ;十位

    MOV   A,  N   ;8位二进制数
LP1:
    INC   30H
    CLR   C
    SUBB  A, #100
    JNC   LP1
    ADD   A, #100

LP2:
    INC   31H
    CLR   C
    SUBB  A, #10
    JNC   LP2
    ADD   A, #10

    MOV   32H, A  ;个位
    
    RET

END

追问

看的不是很明白,能大概解释一下吗

追答

说明:

MOV 30H, #255 ;百位,初始化为-1

MOV A, N ;8位数,0~255
LP1:
INC 30H--第一次加一即为零

CLR C
SUBB A, #100----N 减100

JNC LP1--无借位,再去《商加一、减100》
-------有借位,即不够减了,则停止循环

ADD A, #100--补回减去的100,
-------除以100,到此就结束了。

----------------------

N 的百位数,是 0~2。

如果是0,第一次加一,商就是0,
然后减100,必定不够减,那就不循环了,
补上100 之后,往下,就去除以 10 了。

如果是1,《加一,减100》,就能进行两次。
商,加两次,就是1。
减两次100,才不够减。
补上100 之后,往下,就去除以 10 了。

……

----------------------

循环的《加一,减 10》,最多循环10遍,即可求出十位数。
思路,和求百位数,是相同的。

----------------------

另外网友提供的 C 程序,逻辑上是正确的。

但是,他是在每一个循环里面:
先判断是否够减,够减再减,不够减退出循环。

实际上,判断够减否,就必须做一次减法。
那么,他是每减一个数,必须做两次减法。

就是说,这个C程序,功能,虽然相同,
运算量,却是我的汇编程序的大约两倍。

如果商是 9,他就必须做 18 次减法。
而我的程序,只做 10 次减法、1次加法。

我的程序,在STM32上验证过,是正确的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-27
//采用减法实现除法运算
#include <reg51.h>
extern unsigned char emuDiv10(unsigned char);
extern unsigned char emuMod10(unsigned char);
void main(void)
{
unsigned char c=15;
unsigned char i,j,k;
k=emuMod10(c);
c=emuDiv10(c);
j=emuMod10(c);
c=emuDiv10(c);
i=emuMod10(c);
}
unsigned char emuDiv10(unsigned char x1)
{
unsigned char tmp=0;
while(x1>=10)
{
x1=x1-10;
tmp++;
}
return tmp;
}
unsigned char emuMod10(unsigned char x1)
{
while(x1>=10)
x1=x1-10;
return x1;
}

本回答被网友采纳
相似回答