计算机组成原理——选择结构语句的机器级表示

1.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。

 

汇编代码解释:

  • 把ebp+8的内容赋值给eax
  • 把ebp+12的内容赋值给edx
  • 比较edx和eax的值
  • 若edx<=eax,执行L1
  • 反之执行L2


2.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-10和7,最大标号为17
  •     ja   .L5  //如果大于7,即标号大于7,则跳转到.L5(default)
  •     jmp  *.L8(,%eax,4)  //跳转到.L8 + 4 * (a - 10)

所以其基本处理方法:

以最小标号和最大标号为基础,定义多个跳转符号。
根据减去最小标号的值,跳转到对应的指令处
也就是说如果case的变量相差很大,会产生一个很大的符号表,导致可执行文件的大小增大

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值