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

时间:2016-10-07 20:55:59

标签: assembly bit-manipulation emu8086

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

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

1 个答案:

答案 0 :(得分: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

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