1

cmp と je/jg がアセンブリでどのように機能するかを理解したいと思います。Google でいくつかの例を見ましたが、まだ少し混乱しています。以下に、C 言語に変換しようとしているアセンブリ コードの一部と、対応する C コードを示します。それは正しい方法で実装されていますか、それともcmpの仕組みについて間違った理解をしていますか?

cmp    $0x3,%eax
je     A
cmp    $0x3,%eax
jg     B
cmp    $0x1,%eax
je     C


 int func(int x){


  if(x == 3)
    goto A;

  if (x >3)
    goto B;


  if(x == 1)
     goto C;

    A:
    ......

    B:
    ......

    C:
    ......
4

3 に答える 3

5

cmp と je/jg がどのように機能するかは正しく理解していますが、C コードにエラーがあります。この行:

if (*x == 1)

する必要があります

if (x == 1)

これは、x86 制御フロー命令のかなり良い要約です。

また、同じ値に対して cmp 命令を繰り返す理由はありません。実行したら、比較を繰り返さずに複数の方法で結果をテストできます。したがって、アセンブリ コードは次のようになります。

cmp    $0x3,%eax
je     A
jg     B
cmp    $0x1,%eax
je     C
于 2012-09-30T21:38:52.900 に答える
4

はい、それは正しいです。ただし、C コード*xでは 3 番目の例がありますがx、他のコードでは意味がありません。アセンブリ コードには、対応するコードがありません。

C では、変数の型 (符号付き/符号なし) は変数の宣言時に定義されます。int xまたはunsigned int x、しかしアセンブリでは、比較のための符号付き変数と符号なし変数(メモリ内またはレジスタ内)の区別は、さまざまな条件付きジャンプによって行われます。

符号付き変数の場合:

jg  ; jump if greater
jl  ; jump if less
jge ; jump if greater or equal, "jnl" is synonymous
jle ; jump if less or equal, "jng" is synonymous

符号なし変数の場合:

ja  ; jump if above
jb  ; jump if below
jae ; jump if above or equal, "jnb" is synonymous
jbe ; jump if below or equal, "jna" is synonymous

Intel x86 JUMP クイック リファレンスには、アセンブリで使用可能なすべての条件付きジャンプx86が、それらの条件 (フラグの値) およびショート ジャンプとロング ジャンプのオペコードと共に一覧表示されています。

于 2012-09-30T21:47:33.863 に答える
2

すでにご存知かもしれませんが、プロセッサは、いわゆるフラグレジスタで最後の操作中に発生したことを追跡します。たとえば、操作がオーバーフローした場合、または結果がゼロだった場合などにフラグがあります。cmpニーモニックは、2つのレジスタ/レジスタとメモリの内容を減算するようにプロセッサに指示し、正しいフラグを変更します。その後、行ったジャンプを使用してジャンプできます。プロセッサはフラグをチェックして、それが等しいかどうかを確認します-je(ゼロフラグをチェックします)、または小さい/大きいかどうか(符号なしおよびオーバーフローの場合はオーバーフローフラグ、符号付き数値の場合は符号フラグ)。

于 2012-09-30T22:24:55.567 に答える