我有这个用于计算阶乘的代码:
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(左)。 我该如何解决这个问题?
答案 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
您必须为手动偏移确定汇编程序的正确语法,尽管上面的示例应该非常接近,基于您的代码。