线性汇编总结和函数说明
線性匯編總結(jié)和函數(shù)說(shuō)明
=====================================================================
總體說(shuō)明:
這部分測(cè)試的線性匯編代碼是代碼是與之前提取出來(lái)的函數(shù)塊(見(jiàn)function_module.c)
對(duì)應(yīng)的函數(shù)來(lái)寫的,線性匯編的在原函數(shù)的名稱全面加了asm字樣,提供了C函數(shù)調(diào)用的原型,在
本文檔中對(duì)匯編函數(shù)作了詳細(xì)說(shuō)明,在simulater工程中進(jìn)行了測(cè)試。
----------------------------------------------------------------------
線性匯編經(jīng)驗(yàn)總結(jié):
1. 一般只是對(duì)有循環(huán)結(jié)構(gòu)的代碼編寫匯編替代,非循環(huán)代碼不需要流水,性能提高不大
2. 為形成軟件流水,循環(huán)體不要做條件判斷,如果有條件判斷盡量移到循環(huán)體外,或者用非跳轉(zhuǎn)代碼替代
(例如,在量化相同代碼,用條件跳轉(zhuǎn)的何不用條件跳轉(zhuǎn)的性能相差5倍,再比如內(nèi)存搬移大小不固定的可能產(chǎn)生
條件跳轉(zhuǎn),使用了固定大小的子塊后,子塊大小對(duì)性能影響不大,匯編代碼和C代碼的性能相差20倍左右)
3. 耗時(shí)較多的指令主要是load/store/乘/點(diǎn)乘等指令,一般為提高效率,一個(gè)循環(huán)盡可能處理多個(gè)數(shù)據(jù)操作,如
一般C循環(huán)處理一個(gè)字節(jié)、半字、字的操作,可以一次加載一個(gè)半字、字、雙字進(jìn)行操作處理,由于C64有很多以字節(jié)、
半字為單位處理的指令,加上軟件流水,程序的效率可以提高達(dá)到原來(lái)匯編的2倍、4倍甚至8倍。
4. 碰到雙循環(huán),一般將較小的循環(huán)放到內(nèi)循環(huán),然后外循環(huán)處理一次處理完一個(gè)內(nèi)循環(huán)的操作,大大減少跳轉(zhuǎn)的次數(shù)。
5. 實(shí)現(xiàn)同樣操作盡量用數(shù)據(jù)相關(guān)小易于形成軟件流水的指令,盡量用最少周期的指令,盡量用特殊指令(一般效率比較高)
例如:循環(huán)體實(shí)現(xiàn)一個(gè)操作 val = is<0? -val : val,可以用比較和跳轉(zhuǎn)指令實(shí)現(xiàn)但破環(huán)軟件流水效率低,可以通過(guò)比較
擴(kuò)展求或操作得到一個(gè)-1或1的數(shù),再用乘運(yùn)算實(shí)現(xiàn)這個(gè)操作,雖然周期長(zhǎng)了一些,但能形成軟件流水,實(shí)際提高了效率。
6. 線性匯編一般常見(jiàn)的錯(cuò)誤:
* 一個(gè).sa匯編文件中的多個(gè)函數(shù)體內(nèi)使用同一個(gè)標(biāo)號(hào)(特別是循環(huán)標(biāo)號(hào)loop/LOOP)等,編譯會(huì)報(bào)rededine
的錯(cuò)誤,由于同一個(gè)匯編文件形成同一個(gè)目標(biāo)文件,不同函數(shù)體中重復(fù)/使用同一個(gè)標(biāo)號(hào)肯定是不對(duì)的,要使用不同的標(biāo)號(hào)區(qū)別開
* 指令使用不當(dāng),加/減乘/除/移位等指令一定要注意操作數(shù)的類型,對(duì)于無(wú)符號(hào)/絕對(duì)值類型的操作數(shù)最好
使用無(wú)符號(hào)的操作指令
* 操作數(shù)溢出問(wèn)題
* ...
7. 線性匯編調(diào)試經(jīng)驗(yàn):
* 匯編程序先調(diào)試通過(guò)再進(jìn)入具體工程中使用,一般是新建一個(gè)仿真工程用于編寫、調(diào)試、測(cè)試匯編代碼,
一方面,可以保證匯編程序準(zhǔn)確無(wú)誤;另一方面,可以方便觀察匯編代碼和對(duì)應(yīng)C代碼的性能提高情況,保證仿真測(cè)試下,
匯編代碼的效率確實(shí)比C代碼有所提高。
* 匯編代碼調(diào)試時(shí)先不使用任何優(yōu)化選項(xiàng),這樣可以通過(guò)Debug單步執(zhí)行所編的代碼,便于檢查代碼的錯(cuò)誤,
需要注意的是,即使不使用優(yōu)化選項(xiàng),在沒(méi)有分配資源單元時(shí),編譯器仍然對(duì)寄存器的使用進(jìn)行了調(diào)整(尤其是寄存器冗余
使用時(shí)),即單步調(diào)試時(shí),寄存器的值不一定和代碼里的執(zhí)行得到的值相對(duì)應(yīng),但通過(guò)Watch Window觀察到所有寄存器及其
值的變化。
* 內(nèi)存的觀察最簡(jiǎn)便的方法就是使用memory window,還可以調(diào)整顯示的數(shù)據(jù)類型,通過(guò)紅色標(biāo)記看到存儲(chǔ)
的變化,如果要對(duì)比前后的數(shù)值可以將其打印到輸出窗口。
* 周期性能的測(cè)試,有沒(méi)有使用優(yōu)化選項(xiàng)其結(jié)果的正確性是一致的,匯編程序調(diào)試通過(guò)后,使用優(yōu)化選項(xiàng)
-o2/-o3來(lái)優(yōu)化代碼,使用profile里面的時(shí)鐘工具測(cè)試C代碼和匯編代碼執(zhí)行的周期。
總結(jié)
以上是生活随笔為你收集整理的线性汇编总结和函数说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 消息称索尼即将发布新款 50mm F1.
- 下一篇: 快递股票有哪些龙头股