Assembly 汇编8086:将8位二进制数转换为其等效的灰数?

Assembly 汇编8086:将8位二进制数转换为其等效的灰数?,assembly,gray-code,Assembly,Gray Code,问题: 编写一个程序,使用以下算法将从键盘输入的8位二进制数转换为等效的格雷码二进制数: [断开的图像:] 我正在学习汇编(8086,课堂要求),不知道怎么做 当我从键盘接收到每个字符(1或0)时,是否转换它们?或者,我是否读取整个8位二进制数,在其中循环,并进行转换 我来自Perl/Java,因此将其在汇编中的工作方式可视化有点令人望而生畏。另外,我不确定上面的算法中的符号是什么 感谢您的帮助和批评 我已经很久没有写汇编代码了,但问题似乎更具哲理。在不知道更大目标的情况下,这里有一些想法 输入

问题:

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

[断开的图像:]

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

当我从键盘接收到每个字符(1或0)时,是否转换它们?或者,我是否读取整个8位二进制数,在其中循环,并进行转换

我来自Perl/Java,因此将其在汇编中的工作方式可视化有点令人望而生畏。另外,我不确定上面的算法中的符号是什么


感谢您的帮助和批评

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

输入时转换每个键:在程序运行时,程序多次需要对各个键的笔划做出响应(即动态命令、向上、向下、向左等)。在这种情况下,应单独转换按键笔划。其他情况下,需要转换数据块或字符串,此操作通常在enter键结束时完成,因为它是一个较大的数据块。这些情况需要对字符进行“循环”和转换

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

我希望这有帮助


Ed

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

输入时转换每个键:在程序运行时,程序多次需要对各个键的笔划做出响应(即动态命令、向上、向下、向左等)。在这种情况下,应单独转换按键笔划。其他情况下,需要转换数据块或字符串,此操作通常在enter键结束时完成,因为它是一个较大的数据块。这些情况需要对字符进行“循环”和转换

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

我希望这有帮助


Ed

您可以简单地对字符进行异或运算,并将其自身向右移动一个位置,以获得灰色表示,无需循环。角色处于AL中时的示例:

mov bl, al
shr bl, 1
xor al, bl
AL现在是格雷码表示

在C中,这将是:

c^=c>>1;
c^=c>>4; c^=c>>2; 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>>1;
c^=c>>4; c^=c>>2; c^=c>>1;

您可以简单地对字符进行异或,并将其自身向右移动一个位置,以获得灰色表示,无需循环。角色处于AL中时的示例:

mov bl, al
shr bl, 1
xor al, bl
AL现在是格雷码表示

在C中,这将是:

c^=c>>1;
c^=c>>4; c^=c>>2; 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>>1;
c^=c>>4; c^=c>>2; c^=c>>1;

圆圈中的加号是异或(XOR)运算符。您可以使用任何类型的库吗?因为否则获取输入将是一件非常痛苦的事情。你会在旧的操作系统中运行它吗,比如DOS?不,我不这么认为。我是这样做的。。。数据段参数列表标签字节MAXLEN DB 40 ACTLEN DB?inpchr DB 40 DUP(?)prmpt DB'1或0:$',0DH,0AH,结束开始:mov ax,data mov ds,ax mov es,ax mov bx,1 mov cx,0 Loop1:mov ah,9 lea dx,prmpt int 21H;DOS键盘输入字符mov ah、0AH lea dx、PARLIST int 21H;将输入字符移动到al mov al,inpchr cmp al,49;Is input char==1 jne Loop1 xor bx,1 jmp Loop1 endsThat worked:-{我猜注释中没有代码!循环中的加号是异或(xor)运算符。您可以使用任何类型的库吗?因为否则获取输入将是一件非常麻烦的事。您会在旧操作系统(如DOS)中运行它吗?不,我不这么认为。我是这样做的…数据段参数列表标签字节MAXLEN DB 40 ACTLEN DB?inpchr DB 40 DUP(?)prmpt db'1或0:$',0DH,0AH,ends start:mov ax,data mov ds,ax mov es,ax mov bx,1 mov cx,0 Loop1:mov ah,9 lea dx,prmpt int 21H;DOS键盘输入字符mov ah,0AH lea dx,PARLIST int 21H;将输入字符移动到al mov al,inpchr cmp al,49;是input char==1 jne Loop1 xor bx,1 jmp Loop1 ENDSTH起作用:-{我猜注释中没有代码!