问题:
使用以下算法编写一个程序,将从键盘输入的8位二进制数转换为等效的格雷码二进制数:
我正在学习装配(8086,课程要求),不知道该怎么做。
我从键盘收到的每个字符(1或0)都可以转换吗?或者,我是否读取整个8位二进制数,循环访问它,然后进行转换?
我来自Perl / Java,因此可视化它在装配中的工作方式有点令人生畏。另外,我不确定上述算法中的符号是什么?
感谢您的帮助和批评!
答案 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)
我编写任何汇编代码已经很长时间了,但问题看起来更具哲学性。如果不知道更大的目标,这里有一些想法。
在输入时转换每个键:很多时候程序需要在程序运行时响应各个键击(即动态命令,上,下,左等)。在这种情况下,键击应该单独转换。其他时候,需要转换数据块或字符串,并且此操作通常在输入键结束时完成,这是更大的数据块。这些情况需要将字符“循环”并转换。
但是,在任何一种情况下,“工作”都应该在可以从任何一种情况调用的通用子程序中完成。
我希望这有帮助,
版