2016-09-03 3 views
1

私はUbuntuアセンブリ言語のDosboxで作業しています。インテル8086アセンブリ言語で符号ビットが正数でオンになるのはなぜですか?

mov al, 150 ;(not -150) 

私はデバッガを使用する場合、それは符号ビットがONであることを意味し0202としてFLAGレジスタの値を示しています。私のプログラムは、このラインを持っています。 -150の場合も同様です。なぜサインビットが正の数に設定されているのか混乱していますか?

+6

'MOV'はフラグを変更しません –

+4

ヒント:8ビットレジスタにどのような符号付き整数の範囲が入りますか?ヒント2:['mov 'はフラグに影響しません。](http://www.felixcloutier.com/x86/MOV.html)。ヒント3:gdbのようにFLAGSレジスタをデコードするデバッガを使用してください:) http://stackoverflow.com/tags/x86/info –

+0

しかし、FLAGの値は各行で更新されます。 –

答えて

3

現在使用されているx86とほぼすべてのCPUは、2の補数符号付き算術を使用しています。

バイトは8ビットです。
これは、256の異なる値(2 )を格納できることを意味します。
これらのうちの127は正であり、128は負であり、1つはゼロです。
バイトが負であるかどうかをテストするには、MSB(Most Significant Bit)をテストします。このビットが1ならば、それは負であるとみなされ、ゼロであれば、それは正であるとみなされる。

バイトで150のエンコーディングは、負であるとみなされる1001 0110です。
実際には、負の数を許可しない場合に限り、値を150と解釈できます。あなたがそうするなら、バイトは-106を保持します。

これは符号付きオーバーフローと呼ばれ、OFフラグは、フラグに影響を与える命令を使用して計算を行っている場合にこれを検出します。フラグがあたりとしてCPUの状態を示しhttp://ref.x86asm.net/coder32-abc.html

MOVはでmodif_f列をチェックアウト、MOVがフラグに影響を与えませんので、あなたの質問で間違って何かががあり、フラグ
には影響を与えません。それらの特定のフラグを変更した最後の命令。
命令の中には、フラグのサブセットのみを変更するものがあります。
コードに戻って、フラグに影響を与えた最後の命令を確認する必要があります。

2

符号ビットは、正の数ではではありません。ではありません。

alは8ビットのデータしか保持せず、符号ビットは上位ビットです。署名付きまたは無署名のレジスタの値の解釈はすべてあなたの頭の中にあります。符号ビットを符号ビットとして読み取ると、レジスタが符号付きであることが示され、127〜-128の範囲が得られます。 150がその範囲外であるため、ロールオーバーします。

関連する問題