汇编将 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位寄存器ahal组成:

  ______________ ax ______________
 /                                \
+-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+
|f|e|d|c|b|a|9|8|  |7|6|5|4|3|2|1|0| <- individual bits
+-+-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+
 \____    _____/    \_____    ____/
       ah                  al

如果您想确保 axentirety 设置为 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 寄存器)将完成这项工作。