2011-04-11 6 views
0

この本の "assembly language step by step"は本当に素晴らしいですが、実際のメモリやレジスタのデータを扱うときに2の補数がどのように働くかはわかりません。それと一緒に、私は値がどのようにメモリに表現されているのかわからない。私はそれが私を混乱させているかもしれないと感じている。 anywho ...ASM question、two's complement

「-1 = $ FF、-2 = $ FEなど」と表示されます。今私は数字の2の補数自体が-1倍され、元に追加すると0を与えることを理解します。したがって、FFはバイナリで11111111の16進数で、10進数で255です。私の質問は: "-1 = $ FF"と書かれている本は何ですか? -255 + -1は0を与えるだけでなく、OFフラグを明示的に設定しなかったことを意味しますか?

実際には... 11h(小数点第17位、00100001)が2進数であるとしましょう。この値はALです。 それから私たちはNEG ALを設定し、CFとSFを設定し、ALの値を小数点で239、バイナリで11101111、またはEFhに変更しますか?私はちょうどそれが17 * -1である方法を見ていないのですか?それとも、あなたがオーバーフローを引き起こすのに必要な価値を与えるという意味で、この本の説明が不十分な言葉でしかないのですか?

ありがとうございました!

答えて

1

2の補数では、(-x) == (256 - x) == (~x + 1)です。 (~はNOT演算子のC'ishで、そのオペランドのすべてのビットを反転します。)

11hがあるとします。

100h - 11h == EFh 
(256 - 17 == 239) 

メモ:256はバイトで動作するため、サイズが8ビットになります。 16ビットワードの場合、2^16(65536)、dwords 2^32を使用します。また、すべての数学は、この方法は、あらゆる規模の言葉のために働くバイトのための256、ショートパンツのための65536など

OR、NOT/+ 1を使用して、

~11h = EEh 
+1... EFh 

のmodであることに注意してください。

+0

お返事ありがとうございました!大丈夫です。だから今私の質問は、この種の表記法は何を達成するのだろうか?なぜ、1と2の補数の両方がありますか? –

+0

2の補数は、符号付き数値を表すのに非常に便利な方法であるため、一般的です。 'x - y == x + -y'、一貫して。私はチェックサム(IIRC)としてのIPでの使用以外に、何が良いものなのかを正確には分かりません。 – cHao

+0

@ゼロ:私の想起は2の補数ですが、ハードウェアの実装が少し単純です(減算などのためにハードウェアロジックの特殊ケースが少なくて済むため)。また、0の表現が1つしかないという利点もあります(補数にも負のゼロがあります)。私が考えることができる2の補数の唯一の欠点は、負の数よりも表現できる正の数が少ないことです。例えば、署名された文字は '-128'まで下がることができますが、' 127'までしか上がらないでしょう。その負のゼロはどこかに行かなければならなかった... –

0

"-1 = $ FF"と書かれている本は何ですか?

のみバイトを考慮した場合(16進数のためにそのフォーマットを使用している場合や$FF)、1の2の補数は0xffです。

それを打破するには、1の補数(または1の補数)が0xfeで、その後、あなたは2の補数を取得するために1を追加します:2ための同様0xff

:補数は0xfdで、取得するために1を追加2の補数:0xfe

次に小数点17を見てみましょう。あなたが言うように、それは0x11です。補足は0xeeであり、2の補数は0xefです。あなたの質問に記載した内容に同意します。

ここで、数値を一緒に追加するとどうなるかを実験します。小数点第一に:六角で今

17 + (-17) == 0 

:我々は、サイズが唯一のバイトある数値オブジェクトを扱っているので

0x11 + 0xef == 0x100 

0x1001(ここで手を振って、いくつかの手を破棄されます。 ...)、と我々はにつながる:(私はおそらく、残念ながら、理解しやすい方法でこれを行うことはありません)「手振り」に対処するために

0x11 + 0xef == 0x00 

:オーバフローフラグので、 (OFまたは時々私は知らない理由のためVと呼ばれる)はキャリーフラグと同じである(C)キャリーは(それは算術が正しく発生した署名兆候だ)を無視することができます。おそらくそれほど正確ではないかもしれませんが、有用であると考える方法の1つは、負の2の補数の先頭のゼロは、負でない2の補数の先頭のゼロと同じです。