標(biāo)題:
memcpy匯編
[打印本頁(yè)]
作者:
51黑tt
時(shí)間:
2016-3-5 23:59
標(biāo)題:
memcpy匯編
意間在Linux內(nèi)核中發(fā)現(xiàn)這么一段匯編代碼,更準(zhǔn)確地說(shuō)應(yīng)該是gcc內(nèi)聯(lián)匯編,寫(xiě)得很精彩,拿出來(lái)和大家分享一下。
代碼是在include/asm-i386/string.h中,是針對(duì)i386對(duì)memcpy做進(jìn)一步優(yōu)化。我們知道,一個(gè)簡(jiǎn)單的memcpy其實(shí)和strcpy差不多,區(qū)別只是前者檢查的是復(fù)制的個(gè)數(shù),而后者檢查的是當(dāng)前字符是否是’\0′。
而這顯然還有很大的優(yōu)化余地,首先像這種非常常用的庫(kù)函數(shù)是可以用匯編重寫(xiě)來(lái)提高速度的。當(dāng)然了,可移植性是降低了,但我們可以針對(duì)每個(gè)平臺(tái)寫(xiě)一套匯編。這樣速度上的提升還是蠻樂(lè)觀的。其次,memcpy顯然沒(méi)必要一個(gè)一個(gè)字節(jié)地復(fù)制,其實(shí)我們最多每次也就復(fù)制4個(gè)字節(jié)(當(dāng)然是在i386上),但如果復(fù)制數(shù)量大的話,這種提升還是很明顯的。于是下面的匯編就出來(lái)樂(lè)~!
0.png
(212.43 KB, 下載次數(shù): 35)
下載附件
2016-3-5 23:59 上傳
評(píng)論如下:
34~36
rep=>重復(fù)
movsl=>以long為單位拷貝,從from(%esi)到to(%edi),復(fù)制n/4次。別擔(dān)心,這里是i386。
37~38
恩,用n/4去和n相與。
39
若n/4個(gè)4就是全部則完成,跳轉(zhuǎn)到后面的標(biāo)號(hào),結(jié)束。
40
還有剩下的,好,把n%4剩下的一個(gè)一個(gè)字節(jié)地復(fù)制。
41~44
這里看不懂的就去學(xué)gcc的嵌入?yún)R編語(yǔ)法吧!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1