web-dev-qa-db-ja.com

アセンブリCF(キャリー)およびOF(オーバーフロー)フラグについて

CFは符号なしの実行を示し、OFは符号付きオーバーフローを示すことが知られています。では、アセンブリプログラムはビットのシーケンスにすぎないため、符号なしデータと符号付きデータをどのように区別するのでしょうか。 (タイプ情報用の追加のメモリストレージを介して、または位置情報などを介して?)そしてこれらの2つのフラグは交換可能に使用できますか?

27
Pwn

違いは、データ自体ではなく、データを操作するために使用される命令にあります。最近のコンピューター(1970年頃以降)は、2の補数と呼ばれる整数データの表現を使用しており、符号付きと符号なしの両方の数値で加算と減算がまったく同じように機能します。

  • 表現の違いは、最上位ビット(符号ビットとも呼ばれます)に与えられる解釈です。符号なし数値の場合、数値が完全に正の範囲の上半分にあるときに最上位ビットが設定されます。符号付き数値の場合、数値が範囲全体の下半分と負の半分にあるときに最上位ビットが設定されます。

  • 命令が異なれば、同じビットの解釈も異なる場合があります。たとえば、ほとんどの大きなマシンには、符号付きと符号なしの両方の乗算命令があります。 'set less than'命令のあるマシンには、符号付きと符号なしの両方のフレーバーがある場合があります。

  • OF(オーバーフローフラグ)は、キャリーが結果の最上位ビットの符号を反転して、引数の最上位ビットとは異なるかどうかを示します。数値が符号なしとして解釈される場合、オーバーフローフラグは関係ありませんが、符号付きとして解釈される場合、OFは、たとえば、2つの大きな正の数値が追加され、結果が負であることを意味します。

  • CF(キャリーフラグ)は、ビットがWordから完全に実行されたかどうかを示します(たとえば、ビット33またはビット65)。数値が符号なしとして解釈される場合、キャリーフラグは加算がオーバーフローしたことを意味し、結果が大きすぎてマシンのワードに収まりません。オーバーフローフラグは関係ありません。

あなたの質問に対する答えは、アセンブリコードには符号付きデータと符号なしデータを区別するいくつかの方法があるということです。

  • 符号付きまたは符号なしの比較を行うために、CFまたはOFのいずれかを選択できます。
  • 符号付きまたは符号なしの乗算および除算命令を選択できます。
  • 符号付きまたは符号なしの右シフトを選択できます(符号付きは上位ビットをコピーし、符号なしはゼロにシフトします)。
36
Norman Ramsey

サインをオペコードしようとしないでください。それは不可能です。代わりに、真実を理解しようとするだけです。兆候はありません。すると、差別化するのはサインタイプではなく、自分だけであることがわかります。

18
Crashworks

符号付きデータと符号なしデータを処理するためのさまざまなオペコードがあります。プログラムが2つの符号付き整数を比較する場合は、opcode jljlejg、およびjgeを使用します。ここで、lとgはlessを表します。およびgreaterそれぞれ。プログラムが2つの符号なし整数を比較する場合は、opcode jbjbeja、およびjaeを使用します。ここで、aとbはaboveを表します。およびbそれぞれ低い。 eは、すべての場合で「または等しい」を表します。これらのオペコードは、比較に基づく分岐に使用されます。

同様に、比較に応じてバイトを0または1に設定するsetCC命令もあります。これらの機能は同じです-setlsetlesetgsetgesetbsetbesetasetaeなどがあります。

署名されたオペコードは、フラグZF、OF、およびSFをテストします。符号なしオペコードは、フラグZF、CF、およびSFをテストします。テストされた正確な条件については、 [〜#〜] jcc [〜#〜] 命令および setCC 命令の80386プログラマーズリファレンスマニュアルのセクションを参照してください。

5
Adam Rosenfield

そうではありません。フラグは、条件が発生するたびに設定されます。プログラマーは、自分が使用しているintのタイプを知っているはずであり、そこから、気にかけているかどうかを調べるフラグを知っています。

4
jmucchiello

CPUにバイト/ワード/ロングのタイプをテストして返すように要求する方法はありません。

0xFFは「255」または「-1」を保持する場合があります。これはすべて、プログラムがどのタイプのバイトであるかによって異なります。

「type」、「signess」などの構造は、Javaなどの高級言語でのみ存在し、CPUレベルでは存在しません。最終的には、すべてがCPUのバイトになります。これらの値を解釈および操作する方法を整理および理解するためのプログラム...

ステータスで見つかったCPUフラグは、テストしてそれに応じて反応するのはコード次第であるパラダイムを強制しません。

Intel CPUでは、MMXレジスタとFPUレジスタは実際には同じレジスタを占有します。したがって、一方の操作の値がもう一方の操作を破棄するため、FPUタイプとMMXタイプの命令を同時に混在させることはできません。通常、いずれかを必要とするプログラムは、FPU命令の発行など、1つのモードでアクションを完了してから、MMXを起動する場合がありますが、両方を同時に実行することはできません。

3
mP.

通常、アセンブリプログラムは、符号付きか符号なしかを示す変数とともに特別な情報を持ちません。どのフラグをいつチェックし、どの条件をいつ使用するかを知るのはプログラマーの仕事です(つまり、JGの代わりにJAを使用します)。

したがって、使用するコマンドを知るために、操作しようとしている変数のタイプを知る必要があります。これが、プログラマーが符号付き/符号なし型を交換可能に使用する場合(つまり、明示的なキャストなしで)、ほとんどのプログラミング言語が警告を出す理由です。これはハードウェアで実行できますが、予期しない結果が生じる可能性があるためです。

1
SoapBox