是否可以在x86汇编语言中模仿if-statment(使用masm语法)?我想在x86汇编语言中做这样的事情,但我不确定我应该使用哪个运算符来模仿if-else语句。我应该使用jl
指令,cmp
指令还是其他指令?
int i = 2;
int j = 3;
if(i > j){
i = 1;
}
else{
i = 4;
}
答案 0 :(得分:6)
cmp
和jcc
(即条件跳转)指令的组合可以。查看你的CPU手册。
答案 1 :(得分: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;
在这种情况下,它只是一个cmp
,后跟一个jle
- 语句的“if”部分以jmp
结尾,以跳过语句的else部分。
答案 2 :(得分:1)
假设您有两个装配标签:
cmp j1, j2
jg LABEL1
LABEL2
并且MASM
没有语法,它只是一个编译器,通常命名为Assembler。
Assembly是语言,汇编程序是编译器。
答案 3 :(得分:0)
这可能有助于更好地理解如何在程序集中实现IF
语句。请注意,它不是MASM
语法。
答案 4 :(得分:0)
如果您使用masm32,您可以像c ++一样编写if语句 示例
.if eax == 0
invoke MessageBoxA, NULL, addr strn, offset title, NULL
.endif