x86 アセンブリ言語 (masm 構文を使用) で if ステートメントを模倣することは可能ですか? x86 アセンブリ言語でこのようなことをしたいのですが、if-else ステートメントを模倣するためにどの演算子を使用すればよいかわかりません。jl
命令、cmp
命令、または他の命令を使用する必要がありますか?
int i = 2;
int j = 3;
if(i > j){
i = 1;
}
else{
i = 4;
}
cmp
and jcc
(つまり、条件付きジャンプ) 命令の組み合わせで十分です。CPU のマニュアルを参照してください。
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 部分をスキップします。
2 つのアセンブリ ラベルがあるとします。
cmp j1, j2
jg LABEL1
LABEL2
そしてMASM
「構文を持っている」のではなく、通常はアセンブラーと呼ばれる「コンパイラ」のようなものです。
アセンブリは言語であり、アセンブラは「コンパイラ」です。
masm32 を使用している場合は、C++ の例のように if ステートメントを記述できます
.if eax == 0
invoke MessageBoxA, NULL, addr strn, offset title, NULL
.endif
IF
これは、アセンブリでステートメントを実装する方法をよりよく理解するのに役立つ場合があります。MASM
構文ではないことに注意してください。