0

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

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(右)移动到 num1(左)。我该如何解决这个问题?

4

1 回答 1

2

您正在使用 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

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

于 2016-10-07T21:29:17.613 回答