程序集8086:将8位二进制数转换为等效的格雷数?

时间:2009-06-10 16:56:46

标签: assembly gray-code

问题:

  

使用以下算法编写一个程序,将从键盘输入的8位二进制数转换为等效的格雷码二进制数:

     

[图片损坏:http://www.harborlandings.com/images/grayAlgm.jpg]

我正在学习装配(8086,课程要求),不知道该怎么做。

我从键盘收到的每个字符(1或0)都可以转换吗?或者,我是否读取整个8位二进制数,循环访问它,然后进行转换?

我来自Perl / Java,因此可视化它在装配中的工作方式有点令人生畏。另外,我不确定上述算法中的符号是什么?

感谢您的帮助和批评!

2 个答案:

答案 0 :(得分:2)

你可以简单地将角色x一边向右移动一个位置以获得灰色表示,不需要循环。角色在AL中的示例:

mov bl, al
shr bl, 1
xor al, bl

AL现在是格雷码表示。

在C中,这将是:

c^=c>>1;

要返回二进制表示,您可以将其自身与格雷码相关,通过降低2的幂来向右移动,从小于数据大小的最大2次幂开始,例如:

mov bl, al
shr bl, 4
xor al, bl
mov bl, al
shr bl, 2
xor al, bl
mov bl, al
shr bl, 1
xor al, bl

在C中,这将是:

c^=c>>4; c^=c>>2; c^=c>>1;

答案 1 :(得分:1)

我编写任何汇编代码已经很长时间了,但问题看起来更具哲学性。如果不知道更大的目标,这里有一些想法。

在输入时转换每个键:很多时候程序需要在程序运行时响应各个键击(即动态命令,上,下,左等)。在这种情况下,键击应该单独转换。其他时候,需要转换数据块或字符串,并且此操作通常在输入键结束时完成,这是更大的数据块。这些情况需要将字符“循环”并转换。

但是,在任何一种情况下,“工作”都应该在可以从任何一种情况调用的通用子程序中完成。

我希望这有帮助,