汇编将 al 寄存器值移入 ax
assembly moving al register value into ax
我对汇编完全陌生,在搜索之后我仍然对寄存器有一些疑问。
目前我正在尝试通过以下方式一遍又一遍地划分一个值:
1.divide ax over bl(好像余数去啊,商去al)
2.move al(商) 到 ax
3.jump 到 5 如果 ax 小于或等于 0
4.jump 到 1
5.end
问题出现在指令 2 上,因为我正在尝试将 8 位值移动到 16 位值。
有人知道如何解决这个问题吗?
我用的是emu8086所以寄存器只有x,h,l
你的问题基本上可以归结为:
How do I move al
to ax
.
答案是你不要移动它,它已经在那里了。 16位ax
寄存器由两个8位寄存器ah
和al
组成:
______________ ax ______________
/ \
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|f|e|d|c|b|a|9|8| |7|6|5|4|3|2|1|0| <- individual bits
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
\____ _____/ \_____ ____/
ah al
如果您想确保 ax
的 entirety 设置为 al
中的任何内容,您只需清除 [=15] =] 部分,类似:
and ax, 0ffh
这将清除除最低(最右边)八位以外的所有位,有效地将 f..8
区域设置为全零,从而确保 ax
变为 al
.
一般来说,您可以使用 movsx or movzx. Movsx
maintains the sign of the value 将较小的值移动到较大的位置(这样,如果您移动 0xfe,则变为 0xfffe),而 movzx
zero-extends 值 (这样 0xfe 就变成了 0x00fe)。
但是,在您的特定情况下,您根本不需要进行任何移动。 AL
已经指定了 AX
的低 8 位。你需要做的就是清除AX的高位,你可以通过多种方式做到这一点,但and ax, 0xff
可能是最简单的。
你要区分两种情况:
案例一:
al
包含一个无符号数 (0...255)。在这种情况下,您必须清除 16 位寄存器的高 8 位ax
。
正如 "paxdiablo" 在他的回答中所写,您可以使用 and ax, 0FFh
(3 字节)来完成这项工作,但是指令 mov ah, 0
(2 字节)应该更有效。两条指令都会做同样的事情。
案例二:
al
包含有符号数 (-128...127)。在这种情况下,如果 al
的最高位已清除,则必须清除 ax
的高 8 位;否则你必须设置它们。
cbw
指令(该指令没有参数,因为它只适用于 ax
寄存器)将完成这项工作。
我对汇编完全陌生,在搜索之后我仍然对寄存器有一些疑问。 目前我正在尝试通过以下方式一遍又一遍地划分一个值:
1.divide ax over bl(好像余数去啊,商去al)
2.move al(商) 到 ax
3.jump 到 5 如果 ax 小于或等于 0
4.jump 到 1
5.end
问题出现在指令 2 上,因为我正在尝试将 8 位值移动到 16 位值。 有人知道如何解决这个问题吗?
我用的是emu8086所以寄存器只有x,h,l
你的问题基本上可以归结为:
How do I move
al
toax
.
答案是你不要移动它,它已经在那里了。 16位ax
寄存器由两个8位寄存器ah
和al
组成:
______________ ax ______________
/ \
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|f|e|d|c|b|a|9|8| |7|6|5|4|3|2|1|0| <- individual bits
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
\____ _____/ \_____ ____/
ah al
如果您想确保 ax
的 entirety 设置为 al
中的任何内容,您只需清除 [=15] =] 部分,类似:
and ax, 0ffh
这将清除除最低(最右边)八位以外的所有位,有效地将 f..8
区域设置为全零,从而确保 ax
变为 al
.
一般来说,您可以使用 movsx or movzx. Movsx
maintains the sign of the value 将较小的值移动到较大的位置(这样,如果您移动 0xfe,则变为 0xfffe),而 movzx
zero-extends 值 (这样 0xfe 就变成了 0x00fe)。
但是,在您的特定情况下,您根本不需要进行任何移动。 AL
已经指定了 AX
的低 8 位。你需要做的就是清除AX的高位,你可以通过多种方式做到这一点,但and ax, 0xff
可能是最简单的。
你要区分两种情况:
案例一:
al
包含一个无符号数 (0...255)。在这种情况下,您必须清除 16 位寄存器的高 8 位ax
。
正如 "paxdiablo" 在他的回答中所写,您可以使用 and ax, 0FFh
(3 字节)来完成这项工作,但是指令 mov ah, 0
(2 字节)应该更有效。两条指令都会做同样的事情。
案例二:
al
包含有符号数 (-128...127)。在这种情况下,如果 al
的最高位已清除,则必须清除 ax
的高 8 位;否则你必须设置它们。
cbw
指令(该指令没有参数,因为它只适用于 ax
寄存器)将完成这项工作。