濯茶的前端思考 2014-12-09 15:00 采纳率: 41.2%
浏览 1869
已采纳

关于C代码转为汇编的疑问

深入理解计算机系统的练习题
假设我们想生成下面这个C函数的汇编代码:
int shift_left2_rightn(int x,int n){
x <<=2;
x >>= n;
return ;
}
下面这段代码执行实际的移位,并将最后的结果放在寄存器%eax中。此处省略了两条重要
的指令。参数x和n分别存放在存储器中相对寄存器%ebp中地址偏移8和12的地方。
1 movl 12(%ebp),%ecx Get n
2 movl 8(%ebp),%eax Get x
3 sall $2,%eax x <<=2
4 sarl %cl,%eax x>>=2

根据右边的注释,填出缺失的指令。请用算术右移指令。

gcc编译的。
3和4行是要填的。我把答案直接写出来了。
我的疑问是:4填的为什么不是 sarl %ecx,%eax。
因为%ecx保存的才是n啊?

  • 写回答

1条回答 默认 最新

  • Coursera 2014-12-09 19:33
    关注

    编译器优化导致,cl是ecx的低位,在右移过程中,x >>= n,实际上相当于 x >>= (n%32);而n % 32 = n & 00011111,所以其实n的高位是什么根本不用紧,只需要最低5位,寄存器没法只拿5位,这里直接拿出低8位。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog