计算机基础——选择结构的汇编语⾔表⽰(ifelse、
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-10和7,最⼤标号为17
ja  .L5  //如果⼤于7,即标号⼤于7,则跳转到.L5(default)
jmp*.L8(,%eax,4)  //跳转到.L8 + 4 * (a - 10)
所以其基本处理⽅法:
1. 以最⼩标号和最⼤标号为基础,定义多个跳转符号。
2. 根据减去最⼩标号的值,跳转到对应的指令处
汇编语言要什么基础也就是说如果case的变量相差很⼤,会产⽣⼀个很⼤的符号表,导致可执⾏⽂件的⼤⼩增⼤
当然,当case的值相差较⼤时,如case 10、case 100、case 1000时,编译器会⽣成分段跳转代码,⽽不会采⽤构造跳转表⽅式进⾏跳转。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。