关于MCS-51单片机是如何将单字节二进制数转化为BCD码的问题
程序如下:BINBCD:MOVB,#100(100作为除数送入B中)DIVAB(十六进制数除以100)MOVR3,A(百位数送r3,余数放入B中)MOVA,#10(分离十...
程序如下:BINBCD:MOV B, #100 (100作为除数送入B中)
DIV AB (十六进制数除以100)
MOV R3, A (百位数送r3,余数放入B中)
MOV A, #10 (分离十位数与个位数)
XCH A,B (余数放入A中,除数放入B中)
DIV AB (分离出十位在A中,个位在B中)
SWAP A (十位数交换到A的高4位)
ADD A,B (十位数与个位数相加送入 A中)
END
1 请问这个程序求解的思路是什么?2 该程序的第二句"DIV AB"的解释是十六进制数除以100,可是A中应该存放的是一个八位的二进制数,这是怎么回事?3 最后为什么要十位数与个位数相加,不是要分离十位数与个位数吗? 展开
DIV AB (十六进制数除以100)
MOV R3, A (百位数送r3,余数放入B中)
MOV A, #10 (分离十位数与个位数)
XCH A,B (余数放入A中,除数放入B中)
DIV AB (分离出十位在A中,个位在B中)
SWAP A (十位数交换到A的高4位)
ADD A,B (十位数与个位数相加送入 A中)
END
1 请问这个程序求解的思路是什么?2 该程序的第二句"DIV AB"的解释是十六进制数除以100,可是A中应该存放的是一个八位的二进制数,这是怎么回事?3 最后为什么要十位数与个位数相加,不是要分离十位数与个位数吗? 展开
2个回答
展开全部
乘除法的时候可以不考虑进制的,比如说 #0FFH这个十六进制数 存放于A中,#100这个十进制数放于B中 然后DIV AB 这时 A等于#02H B等于#37H等于55
在然后
假设A中的数为 FFH
BINBCD:
MOV B, #100 (B=100,十进制100,)
DIV AB (A等于#02H,B等于#37H等于55)
MOV R3, A (A=02H)
MOV A, #10 (A=10=0AH,B=55=37H)
XCH A,B (A=55=37H, B=10=0AH)
DIV AB (A=05H=5 , B=5=05H)
SWAP A (A=50H,B=05H)
ADD A,B (A=55H,这时十位各位的BCD吗已经求出来了,将
37H=55转换为55H
END
1 请问这个程序求解的思路是什么?
思路就是对一个数求模和求于来分离百位十位和个位
例如168
168/100=1余68
68/10=6余8
8/1=8余0
这样就分离了百位十位和个位
2 该程序的第二句"DIV AB"的解释是十六进制数除以100,可是A中应该存放的是一个八位的二进制数,这是怎么回事?
这个是你没理解cpu存数据的方式,A中存放的其实归根结底说是二进制数,机器只认识二进制数,对这段程序编译之后我们输入的十进制100也变成二进制数了,我们通常说十六进制数是因为十六进制数和二进制数有位上的对应关系,比如1100 0110B=C6H 也就是说二进制数每4位一段各自写成十六进制数就把二进制转换成十六进制了,
3 最后为什么要十位数与个位数相加,不是要分离十位数与个位数吗?
我想如果你清楚BCD码的含义你就明白了
BCD码就是用十六进制数来表示十进制的数
例如:45H是等于十进制的69的,但如果你说他是BCD码他就代表十进制数45
这样你就会发现不是每个十六进制数都是BCD码的,例如AAH就不是BCD码,因为没有AA这样的十进制数
我最后总结一下,就是我们所说的十进制数也好十六进制数也好,归根到底机器都是要把他变为二进制数的,机器也只认识二进制数,这样你就好理解了,我们不会处理不同进制数之间的运算,运算时必须要把他转换同进制的数,机器也是这样,只不过我们擅长的是十进制的运算,而机器擅长的是二进制运算,二进制数位数多不方便我们就找了一个帮手十六进制数
希望你能看得懂
在然后
假设A中的数为 FFH
BINBCD:
MOV B, #100 (B=100,十进制100,)
DIV AB (A等于#02H,B等于#37H等于55)
MOV R3, A (A=02H)
MOV A, #10 (A=10=0AH,B=55=37H)
XCH A,B (A=55=37H, B=10=0AH)
DIV AB (A=05H=5 , B=5=05H)
SWAP A (A=50H,B=05H)
ADD A,B (A=55H,这时十位各位的BCD吗已经求出来了,将
37H=55转换为55H
END
1 请问这个程序求解的思路是什么?
思路就是对一个数求模和求于来分离百位十位和个位
例如168
168/100=1余68
68/10=6余8
8/1=8余0
这样就分离了百位十位和个位
2 该程序的第二句"DIV AB"的解释是十六进制数除以100,可是A中应该存放的是一个八位的二进制数,这是怎么回事?
这个是你没理解cpu存数据的方式,A中存放的其实归根结底说是二进制数,机器只认识二进制数,对这段程序编译之后我们输入的十进制100也变成二进制数了,我们通常说十六进制数是因为十六进制数和二进制数有位上的对应关系,比如1100 0110B=C6H 也就是说二进制数每4位一段各自写成十六进制数就把二进制转换成十六进制了,
3 最后为什么要十位数与个位数相加,不是要分离十位数与个位数吗?
我想如果你清楚BCD码的含义你就明白了
BCD码就是用十六进制数来表示十进制的数
例如:45H是等于十进制的69的,但如果你说他是BCD码他就代表十进制数45
这样你就会发现不是每个十六进制数都是BCD码的,例如AAH就不是BCD码,因为没有AA这样的十进制数
我最后总结一下,就是我们所说的十进制数也好十六进制数也好,归根到底机器都是要把他变为二进制数的,机器也只认识二进制数,这样你就好理解了,我们不会处理不同进制数之间的运算,运算时必须要把他转换同进制的数,机器也是这样,只不过我们擅长的是十进制的运算,而机器擅长的是二进制运算,二进制数位数多不方便我们就找了一个帮手十六进制数
希望你能看得懂
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询