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
尽管根据您的代码,上面的示例应该非常接近,但您必须为您的汇编器确定正确的手动偏移语法。
我有这个计算阶乘的代码:
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
尽管根据您的代码,上面的示例应该非常接近,但您必须为您的汇编器确定正确的手动偏移语法。