程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c-關於C代碼轉為匯編的疑問

c-關於C代碼轉為匯編的疑問

編輯:編程綜合問答
關於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啊?

最佳回答:


編譯器優化導致,cl是ecx的低位,在右移過程中,x >>= n,實際上相當於 x >>= (n%32);而n % 32 = n & 00011111,所以其實n的高位是什麼根本不用緊,只需要最低5位,寄存器沒法只拿5位,這裡直接拿出低8位。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved