8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

汇编中的复杂 IF 语句

carinho 1月前

30 0

我应该如何在汇编中编写这样的 if 语句?if ((a == b AND a > c) OR c == b) {... 平台:Intel 32 位机器,NASM 语法。更新对于变量类型和值,使用任何...

我应该如何 if 在汇编中写出这样的语句?

if ((a == b AND a > c) OR c == b) { ...

平台:Intel 32位机器,NASM 语法。

更新

对于变量类型和值,使用更容易理解的。我猜整数对我来说就够了。

帖子版权声明 1、本帖标题:汇编中的复杂 IF 语句
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由carinho在本站《if-statement》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您需要将 if 语句拆分为一系列比较和跳转。与在 C 中一样,您可以编写:

    int test = 0;
    
    if (a == b) {
      if (a > c) {
        test = 1;
      }
    }
    
    // assuming lazy evaluation of or:
    if (!test) {
      if (c == b) {
        test = 1;
      }
    }
    
    if (test) {
      // whole condition checked out
    }
    

    这会将复杂的表达式分解为组成部分,您的 asm 也会这样做,尽管您可以通过跳转到仍然相关的部分在 asm 中更干净地编写它。

    假设 a、b 和 c 在堆栈上传递给您(如果它们显然没有从其他地方加载它们)

            mov     eax, DWORD PTR [ebp+8] 
            cmp     eax, DWORD PTR [ebp+12] ; a == b?
            jne     .SECOND                 ; if it's not then no point trying a > c 
            mov     eax, DWORD PTR [ebp+8]
            cmp     eax, DWORD PTR [ebp+16] ; a > c?
            jg      .BODY                   ; if it is then it's sufficient to pass the
    .SECOND:
            mov     eax, DWORD PTR [ebp+16]
            cmp     eax, DWORD PTR [ebp+12] ; second part of condition: c == b?
            jne     .SKIP
    .BODY:
            ; .... do stuff here
            jmp     .DONE
    .SKIP:
            ; this is your else if you have one
    .DONE:
    
  • @jowo,我最初并不担心这个问题,因为不清楚源语言是什么,也没有明显的副作用。但是,我添加了一个脚注来涵盖这种情况。

  • 我认为这里有必要指出,在 C 语言中,AND 和 OR 的左侧会先被求值,而右侧可能会被跳过。如果您想为符合 C 逻辑的 if 语句编写汇编代码,则必须在此处更改顺序。

  • 对于没有副作用的简单表达式(例如给定的表达式),求值的顺序无关紧要(1)。这意味着您可以首先检查“快速”情况( c == b 在本例中,即执行代码最少的情况)。

    汇编 a 中,它基本上是这样的(假设 ax , b bx , c cx ):

        cmp  bx, cx     ; check b == c?
        jeq  is_true    ; final result is true.
    
        cmp  ax, cx     ; otherwise b != c, so check a <= c?
        jle  is_false   ; if so, final result is false.
    
        cmp  ax, bx     ; otherwise a > c, so check a == b?
        jeq  is_true    ; if so, final result is true.
    
    is_false:
        ; do false bit  ; otherwise final result is false.
        jmp  next
    
    is_true:
        ; do true bit
    
    next:
        ; carry on
    

    如果没有错误位,它可以简化为:

        cmp  bx, cx
        jeq  is_true
    
        cmp  ax, bx
        jne  next      ; no false bit, next statement.
    
        cmp  ax, cx
        jle  next      ; no false bit, next statement.
    
    is_true:
        ; do true bit
    
    next:
        ; carry on
    

    (1)如果表达式包含副作用,则求值的顺序可能变得很重要,因为可能会出现短路求值。我的意思是考虑如下表达式(伪代码):

    if a == b and c == d:
        do_something()
    

    在这种情况下,一旦你确定 a b 是平等的,就没有必要比较 c d .

    我没有讨论过这个问题(除了在这个脚注中),因为:

    1. p6

    2. p7

返回
作者最近主题: