3

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

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

5 回答 5

8

cmpjcc(即条件跳转)指令的组合就可以了。查阅你的 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;

在这种情况下,它只是 a cmp,后跟 a jle- 语句的“if”部分以 a 结尾jmp以跳过语句的 else 部分。

于 2013-02-20T17:43:19.243 回答
1

假设您有两个装配标签:

cmp j1, j2
jg LABEL1
LABEL2

并且MASM没有“语法”,它就像一个“编译器”,通常命名为Assembler。


边注:

汇编是语言,汇编器是“编译器”。

于 2013-02-20T17:37:27.143 回答
0

这可能有助于更好地理解如何IF在汇编中实现语句。请注意,它不在MASM语法中。

汇编中的复杂 IF 语句

于 2013-02-20T17:51:45.630 回答
0

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

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