為什麼c語言unsigned char賦值給long使用的是movzbl而不是movzbq?

時間 2021-05-05 23:19:55

1樓:磨劍

最近看《深入理解計算機系統》的時候也有同樣的疑問。據查首先毫無疑問兩者都能達到同樣的效果,但是movzbl的位元組碼更短,X86-64上測試資料表明movzbl為3-byte,movzbq為4-byte,這就意味著更快更小。當然還有說法是movzbl指令效率更高一點,猜測這個可能跟硬體有關吧。

2樓:

(Clarification, not an erratum) Figure 3.5. Although there is an instruction movzbq, the GCC compiler typically generates the instruction movzbl for this purpose, relying on the property that an instruction generating a 4-byte with a register as destination will fill the upper 4 bytes of the register with zeros.

3樓:xynnn

希望有人能夠給出正確回答!我想說說我的想法

我在看《深入理解計算機系統(第三版)》翻譯版第126頁習題3.4也遇到了同樣的問題,我總結為

二者結果相同,但是編譯器取較快,且較短的命令(32位資料傳送快於64位)

因為在x86–64下,當給乙個32為暫存器賦值時,高32位會自動清零(書中p123第4行),例如執行

movabsq $0x0011223344556677,%rax

//%rax=0x0011223344556677

movl $–1,%eax

//%rax=0x00000000ffffffff

回到那個書中的題目,原題目簡而言之,是x86–64下,將%rdi指向記憶體中的unsigned char轉到%rsi指向的long

那麼unsigned char為1個位元組,long為8個位元組

答案是movzbl (%rdi),%eax

movq %rax,(%rsi)

而不是movzbq (%rdi),%rax

movq %rax,(%rsi)

注意前者movzbl會自動把%rax前32位歸零,同時把unsigned char乙個位元組送到%al,而後把第2-4位元組置0;後者直接把unsigned char乙個位元組送到%al,而後把後面第2-8個位元組置0,同樣都會把前32位歸零,差異在於movzbl是32位資料的傳送操作,而movzbq是64位的傳送操作,在效率上32位快於64位,指令長度上32位操作短於64位,從而用movzbl而不是movzbq。

為什麼C語言沒有String型別?

封禁讓我戒乎 語言實現了String,開發者可以省心很多。比C早的Pascal就實現了String,C沒實現,應該是語言的設計者沒有預見到字串操作的頻密。我喜歡Delphi,字串操作方便也是原因之一。 王璐銘 從語言的抽象度角度來說,C是底層語言,他解決的問題一般位於機器模型空間。但是,String...

為學習C 打好C語言基礎,什麼算是C語言基礎?

懂得函式,懂得指標變數,懂得記憶體模型,懂得基本資料型別,懂得變數的生命週期,懂結構體,懂記憶體對齊。c基礎就那麼些,但是指標是真的爽。 leopard 先說結論,沒必要單獨去為了所謂的 基礎 去學習c語言。c 是c的超集,就像小學數學是高中數學的底子一樣。這句話本來沒錯,但是c 經過這麼多年的 發...

C語言可以幹些什麼?C語言主要涉及哪些IT領域?

runner time 一般人靠學C語言去工作比較難,但是學習C語言能幫你更深入地理解作業系統的底層,為進一步學習研究作業系統打下基礎。計算機學習是乙個系統性問題,不可偏廢。比如說光學程式語言但是不學數學,一定會遇到明顯的瓶頸。作業系統當然也是必然要深入的領域。而且很多語言的設計思路借鑑了C語言,可...