【问题标题】:Is it possible to write an if statement in x86 assembly language?是否可以用 x86 汇编语言编写 if 语句?
【发布时间】:2013-02-20 17:27:51
【问题描述】:

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

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

【问题讨论】:

  • 我想我要么需要使用cmpjmpj1 指令来比较这两个变量中的每一个,但我仍然不确定使用哪一个。
  • 我仍然没有找到任何使用 masm 语法的 if 语句的具体示例 -
  • 另外,为什么这个问题被否决了?我还没有找到 x86 汇编语言中 if 语句的任何具体示例(使用 masm 语法)。
  • 让我猜猜,您的问题因明显缺乏努力而被否决。你没有必要的文档,也没有学习任何组装教程足够长的时间,以至于不会问这样简单的问题。
  • @AlexeyFrunze 我学习了许多不同的汇编语言教程,但我仍然不完全了解分支语句是如何工作的,以及如何使用它们。

标签: assembly x86 masm


【解决方案1】:

cmpjcc(即条件跳转)指令的组合就可以了。查阅你的 CPU 手册。

【讨论】:

  • 具体来说,我在 Windows 上使用 masm 汇编器 - 在这种情况下,我应该参考哪个 CPU 手册?
  • 英特尔或 AMD,由您选择。对于 MASM 本身,您需要一个单独的。
  • 我找到了this reference for x86 assembly language,但我几乎无法理解它。在这种情况下,“跳空”是什么意思?
  • x86 并不意味着您应该检查 1986 年的处理器。:-) 而是直接从源代码尝试some original Intel manuals
  • 既然您使用的是 MASM,为什么不直接使用 .if 宏... :-)
【解决方案2】:

你可以查看你的 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 部分。

【讨论】:

    【解决方案3】:

    假设您有两个程序集标签:

    cmp j1, j2
    jg LABEL1
    LABEL2
    

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


    旁注:

    Assembly 是语言,Assembler 是“编译器”。

    【讨论】:

    • 我现在很困惑——编译器(或汇编器)怎么可能没有语法?
    • @AndersonGreen MASM 是编译器,它使用Intel 语法。
    • @Justin:MASM 是一个汇编器,而不是编译器。它使用自己的 Intel 语法风格,例如与 NASM 略有不同,所以是的,谈论 MASM 语法是正常的。 (例如,NASM 中的 mov eax, label 与 MASM 中的 mov eax, OFFSET label 是等价的。)
    【解决方案4】:

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

    Complex IF statement in Assembly

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 2023-03-25
        • 1970-01-01
        • 2016-03-07
        • 2017-01-03
        • 2022-07-20
        • 2015-04-05
        • 1970-01-01
        • 2017-03-26
        相关资源
        最近更新 更多