是否可以用x86汇编语言编写if语句?

时间:2013-02-20 17:27:52

标签: assembly x86 masm

是否可以在x86汇编语言中模仿if-statment(使用masm语法)?我想在x86汇编语言中做这样的事情,但我不确定我应该使用哪个运算符来模仿if-else语句。我应该使用jl指令,cmp指令还是其他指令?

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

5 个答案:

答案 0 :(得分:6)

cmpjcc(即条件跳转)指令的组合可以。查看你的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语法。

Complex IF statement in Assembly

答案 4 :(得分:0)

如果您使用masm32,您可以像c ++一样编写if语句 示例

.if eax == 0
invoke MessageBoxA, NULL, addr strn, offset title, NULL
.endif