zoukankan      html  css  js  c++  java
  • if语句的汇编表示

    转自:https://blog.csdn.net/u011608357/article/details/22586137

    demo:

    C语言:

    int  max(int x,int y)
    {
        if  (x>y)
            return  x;
        else
            return  y;
    }    

    产生的汇编代码如下:

    00000000<max>:
    0: 55          push %ebp
    1: 89   e5    mov %esp,%ebp
    3: 8b  45 08  mov 0x8(%ebp),%eax
    6: 3b  45 0c  cmp 0xc(%ebp),%eax
    9: 7e  05      jle 10 <max+0x10>
    b: 8b  45 08  mov 0x8(%ebp),%eax
    e: eb  03       jmp 13 <max+0x13>
    10: 8b  45 0c  mov 0xc(%ebp),%eax
    13: 5d          pop %ebp
    14: c3          ret

    要理解上面的汇编代码,可以先把C程序写成带有goto语句的版本,

    int max(int x,int y)
    {
        if (x<=y)
        goto x_le_y;
        result=x;
        goto done;
    
        //两个跳转地址
        x_le_y:
            result=y;
        done:
            return result;
    }

    C代码中if(x>y)在汇编中,先判断x是否小于等于y,如果小于等于,则发生跳转,否则不跳转。

    这里,汇编语言也可以使用另外一个规则,

    int max(int x,int y)
    {
        if (x>y)
            goto x_ge_y;
        result=y;
        goto done;
    
    
        x_ge_y:
            result=x;
        done:
            return result;
    }

    实际上,汇编语言没有采用上面的做法,因为在C语言中,许多条件语句只有if语句,没有else语句,上面的代码中在这种情况下,也会至少跳转一次,这样会影响程序的效率。

    汇编语言中的常见跳转语句:

    jmp label直接跳转
    
    je label相等
    jne label不等
    js label负数
    jns label非负数
    
    ja label大于
    jae label大于等于
    jb label小于 jbe label小于等于 jg label大于 jge label大于等于
    jl label小于 jle label小于等于 jg  jge jle jl用于比较有符号数,而ja  jae  jb  jbe用于比较无符号数

    有时,编译器为了加快条件语句的转移速度,会使用条件传送指令,改写max函数,如下:

    int  max(int x,int y)
    {
        return  x>y?x:y;
    }

    其他例子:

    .text
    
    .global  _start
    
    _start:
    
              mov r1,#1
    
              mov r2,#2
    
              cmp r1, r2
    
              bgt  branch1
    
              add  r3,r1,r2
    
              b  end
    
             
    
             branch1:
    
             sub  r3,r1,r2
    
             end: 
    
             nop
    
    C 语言:
    
         if(a>b)
    
             a = a- b
    
        else
    
            a = a +b
  • 相关阅读:
    高性能NoSql数据库 SSDB
    Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory
    Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP
    Java基础-SSM之Spring的AOP编程
    Java基础-SSM之Spring快速入门篇
    Java基础-SSM之mybatis的统计函数和分页查询
    Java基础-SSM之mybatis一对一关联
    Java基础-SSM之mybatis多对多关联
    Java基础-SSM之mybatis的树形控件(自关联)
    Java基础-SSM之mybatis一对多和多对一关系映射
  • 原文地址:https://www.cnblogs.com/little-kwy/p/12256615.html
Copyright © 2011-2022 走看看