キャリーフラグとオーバーフローフラグの論理がわかりました。しかし、このプログラム (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
します。OF
CF
OF
しかし、符号付きの数値を扱うので、オーバーフロー フラグをチェックするべきではありませんか?
また、( )2^15-1=32767
に設定bb
すると; 等しい場合( ) 。190
190^2=36100
CF=0
bb
200
200^2=40000
CF=1
何故ですか?どなたか詳しく説明していただけないでしょうか。
PS: EMU8086 を使用しています。