5

私はアセンブリの学習の半分以上を終えており、符号付き整数と符号なし整数がビットでどのように表示されるかという概念に精通しています。答えがかなり明白になる奇妙な質問に見えるかもしれませんが、私は加算のような算術演算を使用して、一方が符号付きでもう一方が符号なしと見なされる数値のペアに意味があるかどうか疑問に思っているので、正しい結果が得られる以下のような複数の例を考えました。

10000001(1バイト整数および符号なしと見なされ、129に相当)
+
11111111(1バイト整数および符号付き(2の補数システム)と見なされ、-1に相当)


10000000(1バイト整数および128に相当する符号なしロジック)

ここで、上限値がALレジスタにあり、次の命令コード(GAS形式)がある場合:

addb -1, %al

次に、EFLAGSレジスタのキャリーフラグ(CF)は、操作が実行された後に設定され、実際には発生していないオーバーフローを通知します。おそらく、オーバーフローに関して符号なしの数値が1つあるため、EFLAGSレジスタのオーバーフローフラグ(OF)が通知されます。参照する必要があります。ですから、そのようなことをすることが賢明であるかどうか私は混乱しています。

4

5 に答える 5

6

数学的には、符号付きまたは符号なしの番号を追加しません。2 32を法とする値のみがあります(32ビットレジスタがあると想定)。このような値は、2 32の連続する整数の範囲をカバーしますが、その範囲はほぼどこからでも始まると自由に解釈できます。「符号付き」と「符号なし」は、そのような解釈の2つにすぎません。

つまり、4ビットレジスタの場合、「1011」の符号なし解釈は11であり、符号付き解釈はマイナス5です。しかし、値は1つだけです(数学者は伝統的に符号なしの解釈が好きなので、数学者は通常「11モジュロ2 4 」と呼びます)。たとえば、その値に「0110」を追加すると(符号付きと符号なしの両方の解釈で「6」)、適切な値である「0001」が得られます。マイナス5プラス6は1を生成し、11プラス6は17であり、モジュロ2 4を減らした場合も1に等しくなります(17は1 + 16です。「モジュロ24を減らすは、16で割って余りだけを保持することです)。

別の言い方をすれば、数値の(2進数の)桁数は概念的に左側で無限です。CPUレジスタは、右端の32ビットのみを保持します。符号なしの解釈は、従来、左端のすべてのビットがゼロであると想定することです。符号付きの解釈は、従来、左端のすべてのビットがビット31と同じ値である(つまり、すべてが0であるか、すべてが1である)と想定することです。いずれにせよ、加算(または減算または乗算)を実行すると、キャリーは右から左に伝播し、その逆ではないため、無視されたビットの値は32ビットの結果とはまったく関係ありません。したがって、「追加」オペコードは1つだけです。これは、そのオペランドがプログラマーの頭の中で「署名済み」であるか「署名済み」であるかを少しも気にしません。

合同算術と互換性のない演算を実行する場合は、符号を考慮する必要があります。表示用の10進数のシーケンスへの変換はそのような操作です。ただし、より頻繁なケースは比較です。232を法とする値は順序付けられていません。それらは一種の循環ループにあります(1を2 32 -1に加算し、モジュロ2 32を減らすと、0に戻ります)。比較は、整数の全範囲の整数を考慮する場合にのみ意味あります。その時点で、符号付きまたは符号なしの解釈を使用するかどうかを決定する必要があります。これが、x86プロセッサがjg(大きい場合はジャンプ、署名付きの解釈)とja(上記の場合はジャンプ、署名なしの解釈)の両方を提供する理由です。

于 2011-01-10T15:17:37.477 に答える
3

バイナリレベルでは、加算演算は1つだけです。

 0101 + (5)
 1010 = (unsigned 10 or signed -6)
--------
 1111   (unsigned 15 or signed -1)

キャリーフラグとオーバーフローフラグについては、どちらも単純なルールに従って設定されています。CFは、オペランドが符号なしであると見なす場合にoveflowを検出するために使用でき、OFは、両方が符号付きであると見なす場合にoveflowを検出するために使用できます。これらのフラグは両方とも結果に応じて設定され、どちらを使用するかはユーザーが決定します。

OFフラグの実際の式は次のとおりです。

OF = CF xor MSB_of_result.

これは、2つの正の数(符号付きと見なす)を加算する場合、結果が負の場合、それはオーバーフローしたことを意味します。

于 2011-01-10T09:45:55.363 に答える
3

数値または演算が符号付きか符号なしかは、解釈の問題です。加算を行うと、2つの数値が加算されて、キャリーフラグ10000000にaが含まれるよう1になります(「フロントエンドから外れた」ため)。次に、それが何を意味するかを解釈するのは後続の操作次第です(他の場所でビットを使用する場合は、操作を折り返しなしで符号なしの追加として扱っているようです。ビットを破棄すると、符号付きを実行しているかのようになります。追加)。

于 2011-01-10T09:33:15.383 に答える
1

「署名済み」と「署名なし」は解釈です。組み立て手順には、通常、解釈が文書化されています。ADD-SIGNED-UNSIGNED引数の1つを符号付きの値として解釈し、もう1つを符号なしとして解釈する命令があるアーキテクチャを私は知りません。それにもほとんど価値がないようです。2の補数の整数演算では、とにかくいくつかのフラグレジスタに唯一の違いがあります。

于 2011-01-10T09:56:04.467 に答える
1

私の主な関心事である問題に関するこの非常に素晴らしい記事を見つけました。記事を読んだ後、答えは明確です。

于 2011-01-15T09:40:27.397 に答える