arm_gcc內(nèi)嵌匯編手冊(cè)

arm_gcc內(nèi)嵌匯編手冊(cè)

ID:12306553

大?。?8.85 KB

頁(yè)數(shù):9頁(yè)

時(shí)間:2018-07-16

arm_gcc內(nèi)嵌匯編手冊(cè)_第1頁(yè)
arm_gcc內(nèi)嵌匯編手冊(cè)_第2頁(yè)
arm_gcc內(nèi)嵌匯編手冊(cè)_第3頁(yè)
arm_gcc內(nèi)嵌匯編手冊(cè)_第4頁(yè)
arm_gcc內(nèi)嵌匯編手冊(cè)_第5頁(yè)
資源描述:

《arm_gcc內(nèi)嵌匯編手冊(cè)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)

1、ARMGCC內(nèi)嵌(inline)匯編手冊(cè)關(guān)于這篇文檔對(duì)于基于ARM的RISC處理器,GNUC編譯器提供了在C代碼中內(nèi)嵌匯編的功能。這種非??岬奶匦蕴峁┝薈代碼沒(méi)有的功能,比如手動(dòng)優(yōu)化軟件關(guān)鍵部分的代碼、使用相關(guān)的處理器指令。這里設(shè)想了讀者是熟練編寫(xiě)ARM匯編程序讀者,因?yàn)樵撈臋n不是ARM匯編手冊(cè)。同樣也不是C語(yǔ)言手冊(cè)。這篇文檔假設(shè)使用的是GCC4的版本,但是對(duì)于早期的版本也有效。GCCasm聲明讓我們以一個(gè)簡(jiǎn)單的例子開(kāi)始。就像C中的聲明一樣,下面的聲明代碼可能出現(xiàn)在你的代碼中。/*NOP例子*

2、/asm("movr0,r0")該語(yǔ)句的作用是將r0移動(dòng)到r0中。換句話(huà)講他并不干任何事。典型的就是NOP指令,作用就是短時(shí)的延時(shí)。請(qǐng)接著閱讀和學(xué)習(xí)這篇文檔,因?yàn)樵撀暶鞑⒉幌衲阆胂蟮暮推渌腃語(yǔ)句一樣。內(nèi)嵌匯編使用匯編指令就像在純匯編程序中使用的方法一樣??梢栽谝粋€(gè)asm聲明中寫(xiě)多個(gè)匯編指令。但是為了增加程序的可讀性,最好將每一個(gè)匯編指令單獨(dú)放一行。asm("movr0,r0t""movr0,r0t""movr0,r0t""movr0,r0")換行符和制表符的使用可以使得指令列

3、表看起來(lái)變得美觀(guān)。你第一次看起來(lái)可能有點(diǎn)怪異,但是當(dāng)C編譯器編譯C語(yǔ)句的是候,它就是按照上面(換行和制表)生成匯編的。到目前為止,匯編指令和你寫(xiě)的純匯編程序中的代碼沒(méi)什么區(qū)別。但是對(duì)比其它的C聲明,asm的常量和寄存器的處理是不一樣的。通用的內(nèi)嵌匯編模版是這樣的。asm(code:outputoperandlist:inputoperandlist:clobberlist)匯編和C語(yǔ)句這間的聯(lián)系是通過(guò)上面asm聲明中可選的outputoperandlist和inputoperandlist。Cl

4、obberlist后面再講。下面是將C語(yǔ)言的一個(gè)整型變量傳遞給匯編,邏輯左移一位后在傳遞給C語(yǔ)言的另外一個(gè)整型變量。/*Rotatingbitsexample*/asm("mov%[result],%[value],ror#1":[result]"=r"(y):[value]"r"(x))每一個(gè)asm語(yǔ)句被冒號(hào)(:)分成了四個(gè)部分。l匯編指令放在第一部分中的“”中間。"mov%[result],%[value],ror#1"l接下來(lái)是冒號(hào)后的可選擇的outputoperandlist,每一個(gè)條目

5、是由一對(duì)[](方括號(hào))和被他包括的符號(hào)名組成,它后面跟著限制性字符串,再后面是圓括號(hào)和它括著的C變量。這個(gè)例子中只有一個(gè)條目。[result]"=r"(y)l接著冒號(hào)后面是輸入操作符列表,它的語(yǔ)法和輸入操作列表一樣[value]"r"(x)l破壞符列表,在本例中沒(méi)有使用就像上面的NOP例子,asm聲明的4個(gè)部分中,只要最尾部沒(méi)有使用的部分都可以省略。但是有有一點(diǎn)要注意的是,上面的4個(gè)部分中只要后面的還要使用,前面的部分沒(méi)有使用也不能省略,必須空但是保留冒號(hào)。下面的一個(gè)例子就是設(shè)置ARMSoc的C

6、PSR寄存器,它有input但是沒(méi)有outputoperand。asm("msrcpsr,%[ps]"::[ps]"r"(status))即使匯編代碼沒(méi)有使用,代碼部分也要保留空字符串。下面的例子使用了一個(gè)特別的破壞符,目的就是告訴編譯器內(nèi)存被修改過(guò)了。這里的破壞符在下面的優(yōu)化部分在講解。asm("":::"memory")為了增加代碼的可讀性,你可以使用換行,空格,還有C風(fēng)格的注釋。asm("mov%[result],%[value],ror#1":[result]"=r"(y)/*Rotat

7、ionresult.*/:[value]"r"(x)/*Rotatedvalue.*/:/*Noclobbers*/)在代碼部分%后面跟著的是后面兩個(gè)部分方括號(hào)中的符號(hào),它指的是相同符號(hào)操作列表中的一個(gè)條目。%[result]表示第二部分的C變量y,%[value]表示三部分的C變量x;符號(hào)操作符的名字使用了獨(dú)立的命名空間。這就意味著它使用的是其他的符號(hào)表。簡(jiǎn)單一點(diǎn)就是說(shuō)你不必關(guān)心使用的符號(hào)名在C代碼中已經(jīng)使用了。在早期的C代碼中,循環(huán)移位的例子必須要這么寫(xiě):asm("mov%0,%1,ror#

8、1":"=r"(result):"r"(value))在匯編代碼中操作數(shù)的引用使用的是%后面跟一個(gè)數(shù)字,%1代表第一個(gè)操作數(shù),%2代碼第二個(gè)操作數(shù),往后的類(lèi)推。這個(gè)方法目前最新的編譯器還是支持的。但是它不便于維護(hù)代碼。試想一下,你寫(xiě)了大量的匯編指令的代碼,要是你想插入一個(gè)操作數(shù),那么你就不得不從新修改操作數(shù)編號(hào)。優(yōu)化C代碼有兩種情況決定了你必須使用匯編。1st,C限制了你更加貼近底層操作硬件,比如,C中沒(méi)有直接修改程序狀態(tài)寄存器(PSR)的聲明。2nd就是要寫(xiě)出更加優(yōu)化的代碼。毫無(wú)疑問(wèn)GNUC代

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。