3

x86 アセンブリ言語 (masm 構文を使用) で if ステートメントを模倣することは可能ですか? x86 アセンブリ言語でこのようなことをしたいのですが、if-else ステートメントを模倣するためにどの演算子を使用すればよいかわかりません。jl命令、cmp命令、または他の命令を使用する必要がありますか?

int i = 2;
int j = 3;
if(i > j){
    i = 1;
}
else{
    i = 4;
}
4

5 に答える 5

8

cmpand jcc(つまり、条件付きジャンプ) 命令の組み合わせで十分です。CPU のマニュアルを参照してください。

于 2013-02-20T17:30:36.210 に答える
3

CPU のマニュアルを調べるか、コンパイラに問い合わせることができます。

gcc -c foo.c
objdump -d foo.o

foo.c は単純なメソッドの単なる関数です。出力は

00000000 <_foo>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
   6:   c7 45 fc 02 00 00 00    movl   $0x2,-0x4(%ebp)
   d:   c7 45 f8 03 00 00 00    movl   $0x3,-0x8(%ebp)
  14:   8b 45 fc                mov    -0x4(%ebp),%eax
  17:   3b 45 f8                cmp    -0x8(%ebp),%eax
  1a:   7e 09                   jle    25 <_foo+0x25>
  1c:   c7 45 fc 01 00 00 00    movl   $0x1,-0x4(%ebp)
  23:   eb 07                   jmp    2c <_foo+0x2c>
  25:   c7 45 fc 04 00 00 00    movl   $0x4,-0x4(%ebp)
  2c:   c9                      leave
  2d:   c3                      ret
  2e:   90                      nop
  2f:   90                      nop

最初のものは、スタックのセットアップ/呼び出し規約の処理です。重要なビットはこれです

  17:   3b 45 f8                cmp    -0x8(%ebp),%eax
  1a:   7e 09                   jle    25 <_foo+0x25>
  1c:   c7 45 fc 01 00 00 00    movl   $0x1,-0x4(%ebp)    // i = 1;
  23:   eb 07                   jmp    2c <_foo+0x2c>
  25:   c7 45 fc 04 00 00 00    movl   $0x4,-0x4(%ebp)    // i = 4;

この場合、単に acmpの後にa が続きますjle- ステートメントの「if」部分は a で終わり、ステートメントjmpの else 部分をスキップします。

于 2013-02-20T17:43:19.243 に答える
1

2 つのアセンブリ ラベルがあるとします。

cmp j1, j2
jg LABEL1
LABEL2

そしてMASM「構文を持っている」のではなく、通常はアセンブラーと呼ばれる「コンパイラ」のようなものです。


サイドノート:

アセンブリは言語であり、アセンブラは「コンパイラ」です。

于 2013-02-20T17:37:27.143 に答える
0

masm32 を使用している場合は、C++ の例のように if ステートメントを記述できます

.if eax == 0
invoke MessageBoxA, NULL, addr strn, offset title, NULL
.endif
于 2013-04-01T20:00:49.987 に答える
0

IFこれは、アセンブリでステートメントを実装する方法をよりよく理解するのに役立つ場合があります。MASM構文ではないことに注意してください。

アセンブリ内の複雑な IF ステートメント

于 2013-02-20T17:51:45.630 に答える