1

キャリーフラグとオーバーフローフラグの論理がわかりました。しかし、このプログラム (MASM 8086 で書かれたもの) を読んだとき、私は少し戸惑いました。

プログラムの目的は、二次方程式に 2 つの別個の解があるか、2 つの等しい解があるか、まったく解がないかを判断することです。

.model small
.stack
.data
aa dw 2
bb dw 4
cc dw 2
sol_msg    db "There exist two real solutions", CR, NL
no_sol_msg db "No real solutions!            ", CR, NL
sol_coinc  db "The two solutions coincide!   ", CR, NL
.code
.startup
mov ax, bb
imul bb
jc overflow ; I decided to work at most with 16-bit numbers
push ax
mov ax, aa
imul cc
jc overflow
mov bx, 4
imul bx
jc overflow
pop bx
sub bx, ax
jo overflow
js mess2
jz mess3
lea si, sol_msg
jmp next
mess2: lea si, no_sol_msg
jmp next
mess3: lea si, sol_coinc
next: mov bx, LUNG_MSG
mov ah, 2
loop1: mov dl, [si]
INT 21h
inc si
dec bx
jnz loop1
jmp end1
overflow:
nop
end1: 
.exit
end

さて、私の疑問は次のとおりです。なぜ最初の 3 つのチェックでキャリー フラグがテストされ、最後のチェックでオーバーフロー フラグがテストされたのでしょうか。

最後の例では、2 つの符号付き数値の間で減算を行っているため (これは私たちが考えているように)、オーバーフロー フラグをチェックして、オーバーフローがあるかどうか (つまり、数値が interval を超えているかどうか) を確認する必要があります[-2^15,2^15-1]。しかし、たとえば最初のものについては、 を(bb)^2使用しimulます。

したがって、それらを 16 ビットの符号付き数値 (so -2^15 <= bb <= 2^15-1) と見なし、(乗算アルゴリズムで) 少なくとも 1 つの和が / ビットをオンにする場合、乗算は / ビットをオンに設定CFします。OFCFOF

しかし、符号付きの数値を扱うので、オーバーフロー フラグをチェックするべきではありませんか?

また、( )2^15-1=32767に設定bbすると; 等しい場合( ) 。190190^2=36100CF=0bb200200^2=40000CF=1

何故ですか?どなたか詳しく説明していただけないでしょうか。

PS: EMU8086 を使用しています。

4

2 に答える 2

3

Intel の docs で IMULの疑似アルゴリズムを見れば、

IF OperandSize = 16
THEN
  TMP_XP ← AX ∗ SRC (* Signed multiplication; TMP_XP is a signed integer at twice the width of the SRC *)
  DX:AX ← TMP_XP[31:0];
  SF ← TMP_XP[15];
  IF SignExtend(TMP_XP[15:0]) = TMP_XP
    THEN CF ← 0; OF ← 0;
    ELSE CF ← 1; OF ← 1;
  FI;
FI;

CF両方が設定さOFれるか、両方がクリアされます。したがって、後でいずれかのフラグを確認できますIMUL

于 2015-04-26T11:47:34.847 に答える
1

IMUL の場合: CF および OF フラグは、中間積の符号付き整数値が符号拡張されたオペランド サイズの切り捨てられた積と異なる場合に設定されます。そうでない場合、CF および OF フラグはクリアされます。命令の 1 オペランド形式の場合、CF フラグと OF フラグは、有効ビットが結果の上半分にキャリーされるとセットされ、結果が結果の下半分にぴったり収まるとクリアされます。つまり、これらのフラグはここではほぼ同じです。SUB の場合: SUB 命令は整数減算を実行します。符号付き整数オペランドと符号なし整数オペランドの両方の結果を評価し、OF フラグと CF フラグを設定して、それぞれ符号付きまたは符号なしの結果のオーバーフローを示します。SF フラグは、署名された結果の符号を示します。OF は署名付きです。命令セットのリファレンス マニュアルを確認してください。この古いコードでもまだ現実的です。でも見てくださいx86 フラグ

于 2015-04-26T11:40:58.943 に答える