【问题标题】:Assembly 8086: Converting 8-bit binary number to its Gray number equivalent?程序集 8086:将 8 位二进制数转换为其等效的格雷数?
【发布时间】:2009-06-10 16:56:45
【问题描述】:

问题:

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

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

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

当我从键盘接收到每个字符(1 或 0)时,我会转换它吗?或者,我是读入整个 8 位二进制数,循环遍历它,边做边转换?

我来自 Perl/Java,因此想象它在汇编中的工作方式有点令人生畏。另外,我不确定上面算法中的符号是什么?

感谢您的帮助和批评!

【问题讨论】:

  • plus-in-a-circle 是异或 (XOR) 运算符。
  • 你可以使用任何类型的库吗?因为否则获得输入将是一件非常痛苦的事情。
  • 你会在操作系统中运行它吗,比如DOS?
  • 不,我不这么认为。我已经通过以下方式完成此操作...数据段 PARLIST LABEL BYTE MAXLEN DB 40 ACTLEN DB ? inpchr DB 40 DUP(?) prmpt db '1 or 0: $', 0DH, 0AH, ends start: mov ax, data mov ds, ax mov es, ax mov bx, 1 mov cx, 0 Loop1: mov ah, 9引导 dx,提示 int 21H ; DOS键盘输入字符 mov ah, 0AH lea dx, PARLIST int 21H ;将输入字符移动到 al mov al, inpchr cmp al, 49 ;是输入 char == 1 jne Loop1 xor bx, 1 jmp Loop1 结束
  • 那行得通:-{ 我猜 cmets 中没有代码!

标签: assembly gray-code


【解决方案1】:

您可以简单地对自身右移一位的字符进行异或运算,以获得灰色表示,无需循环。当你的角色在 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;

【讨论】:

    【解决方案2】:

    我已经很长时间没有编写任何汇编代码了,但这些问题似乎更具哲学性。在不知道更大的目标的情况下,这里有一些想法。

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

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

    希望对你有帮助,

    埃德

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 2011-02-10
      • 2018-09-15
      • 2021-11-14
      • 2016-10-06
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 2022-07-11
      相关资源
      最近更新 更多