计算机基础——选择结构的汇编语言表示(if else、switch~case)

if~else语句的机器级表示

int  get_cont( int *p1, int *p2 ) 
{       
      if  ( p1 > p2 )  
            return *p2;
      else
           return *p1;
}

p1和p2对应实参的存储地址分别为R[ebp]+8、R[ebp]+12,EBP指向当前栈帧底部,结果存放在EAX。

汇编代码解释:

  1. 把ebp+8的内容赋值给eax
  2. 把ebp+12的内容赋值给edx
  3. 比较edx和eax的值
  4. 若edx<=eax,执行L1
  5. 反之执行L2

switch~case语句的机器级表示

int sw_test(int a, int b, int c)
{
    int result;
    switch(a) {
    case 15:
        c=b&0x0f;
    case 10: 
        result=c+50;  break;
    case 12:
    case 17:
        result=b+50;  break;
    case 14:
        result=b; break;
    default:
        result=a;
    }
    return result;
}

switch-case:采用构造跳转表方式进行处理。

    movl 8%ebp),%eax  //a的值送%eax

    subl $10, %eax  //%eax = %eax - 10,最小标号为10

    cmpl $7, %eax  //比较a-107,最大标号为17

    ja   .L5  //如果大于7,即标号大于7,则跳转到.L5(default)

    jmp  *.L8(,%eax,4)  //跳转到.L8 + 4 * (a - 10)

所以其基本处理方法:

  1. 以最小标号和最大标号为基础,定义多个跳转符号。
  2. 根据减去最小标号的值,跳转到对应的指令处

也就是说如果case的变量相差很大,会产生一个很大的符号表,导致可执行文件的大小增大

当然,当case的值相差较大时,如case 10case 100case 1000时,编译器会生成分段跳转代码,而不会采用构造跳转表方式进行跳转。

猜你喜欢

转载自blog.csdn.net/weixin_42562514/article/details/85256601