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 が num1(左) と num1(右) の 2 つのバイト グループに分割されているとします。ビットをシフトすると、num1(right) から num1(left) に移動しません。どうすればこれを解決できますか?

4

1 に答える 1

2

16 ビット アセンブラで作業しているため、16 ビット命令で 32 ビット値をシフトすることはできません。

shl num1, 16

暗黙のうちに次と同じです (アセンブラがこの構文をサポートしているかどうかはわかりませんが、アイデアを得ることができるはずです):

shl word ptr ds:[num1], 16

8086/80286 アセンブラで。8086/80286 アセンブラには 32 ビットに相当するものはありません。

16 ビット コードで作業しているように見えるため、次の 2 つの方法のいずれかでこれを解決できます。

1) 1 つの 32 ビット ワードではなく、2 つの 16 ビット ワードを宣言します。

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 に答える