shl 不会在 2 个字节组 (x86) 之间移动位

shl won't move bits between 2 byte groups (x86)

我有这个计算阶乘的代码:

jmp start

; variables
num1 DD 0001h

start:  mov cl, al

        factorial_loop: ; cx = ax -> 1
            mov al, cl
            mul num1
            ; combine dx and ax into num1
            mov num1, dx
            shl num1, 16
            add num1, ax
        loop factorial_loop

mov ah, 0
int 16h

ret

在代码的开头,我将 num1 声明为一个 4 字节变量。 假设 num1 分为 2 个字节组:num1(左)和 num1(右)。 当我移动这些位时,它们不会从 num1(right) 移动到 num1(left)。 我该如何解决?

您正在使用 16 位汇编程序,因此您不能使用 16 位指令移位 32 位值。

shl num1, 16

隐含地等同于(不确定你的汇编器是否支持这种语法,但你应该能够明白这个想法):

shl word ptr ds:[num1], 16

在 8086/80286 汇编器中。 8086/80286 汇编器中没有 32 位等效项。

由于您似乎在使用 16 位代码,因此您可以通过以下两种方式之一解决此问题:

1)声明两个16位字而不是一个32位字,如

numlo dw 0     ; these are encoded exactly like num1,
numhi dw 0     ; but are declared separately for easier use

...

mov numlo,dx   ; just write to the appropriate 16-bit word
mov numhi,ax   ; without the need to shift at all

2) 或应用手动偏移,例如

mov [num1+2],dx
mov num1,ax

尽管根据您的代码,上面的示例应该非常接近,但您必须为您的汇编器确定正确的手动偏移语法。