将二进制中的2位数字拆分为二进制中的单个数字

时间:2011-10-21 00:53:14

标签: assembly 8085

我有47,二进制它是0010 1111.我需要拆分47所以我得到4个二进制0000 0100和7个二进制0000 0111。

我看到this answer但是我想知道,因为英特尔8085没有div指令我必须通过连续减法来划分,我如何得到模数呢?

3 个答案:

答案 0 :(得分:3)

如果您的处理器没有除法指令(或BCD转换指令,这将是另一种方式),您只需要重复减法。伪代码就像:

    val = 47

    units = val
    tens = 0
loop:
    if units < 10 goto done
    units = units - 10
    tens = tens + 1
    goto loop
done:
    ;; tens = 4, units = 7.

对于那里相当BASIC编码风格的抱歉,我只是试着让它更接近汇编语言的外观。否则,我会使用while循环: - )

units变量低于10时,它就是 val = 247 units = val tens = 0 hundreds = 0 loop1: if units < 100 goto loop2 units = units - 100 hundreds = hundreds + 1 goto loop1 loop2: if units < 10 goto done units = units - 10 tens = tens + 1 goto loop2 done: ;; hundreds = 2, tens = 4, units = 7. 变量中剩下的。

为了完整性(如果这是一个家庭作业,可能需要额外的分数,轻推微调,眨眼眨眼),因为一个八位字节最多可以处理255个:

val = 47

units = val
tens = 0
while units >= 10:
    units = units - 10
    tens = tens + 1

print "Tens = %d, Units = %d"%(tens,units)

作为此方法的证明,您可以尝试以下Python代码:

Tens = 4, Units = 7

确实输出了:

    a
   ---
f |   | b
   -g-
e |   | c
   ---     . h
    d

使用这些值来驱动LED设备而言,简单的查找表可能是最简单的。构造一个需要写入两个8位内存地址的值数组,然后使用该数字查找这些值以写入设备。

我会使用简化的七段LED(加小数点),因为它更容易理解:

abcdefgh

在这个例子中,假设你将一个字节 abcdefgh 0 11111100 1 01100000 2 11011010 3 11110010 4 01100110 5 10110110 6 10111110 7 11100000 8 11111110 9 11110110 写入一个内存映射位置,这个字节中的位控制着哪些段。

不同数字(不带小数点)的值是(未经测试,因此可能需要进行一些调整):

01100110

给定值为4,您只需在该表中的偏移量4处查找字节(使用表的基址和值的简单添加),然后从内存中提取该字节并使用它来设置LED段。该值b将设置细分cfg| | --- | ,为您提供:

{{1}}

你的特殊情况有点复杂,因为你有一个十五段LED并且必须写一个字而不是一个字节,但理论完全一样。

为每个数字创建一个值表,并使用上面算法计算出的值来偏移到该表中。

答案 1 :(得分:0)

我建议的解决方案是考虑你总是有两个十六进制数字(在你使用4和7的例子中,但它可以是A和E)。 *和7是0111,而不是写成的1111

这是一个提示,1个十六进制数字恰好对应4个二进制数字。 因此,例如0xA245是1010(A)0010(2)0100(4)0101(5)。

最后,我的建议只是执行4位的右旋转以获得高半字节(4)。要获得7,只需在高半字节(0x0F)处将字节屏蔽为0。

在C中它会是这样的: highNibble = value&gt;&gt; 4; lowNibble = Value&amp;为0x0F;

我希望我明确表达,并帮助您解决这个问题。

答案 2 :(得分:0)

你基本上在这里处理BCD representation。从二进制转换为BCD有很多资源,之后获取各个数字非常容易。

例如,使用these instructions将二进制转换为bcd,然后简单地循环遍历BCD数字的子地址,将每个数据作为单个独立字节读取。代码简单,快速,重点突出。