一步步编写操作系统81 att内嵌汇编语法
內(nèi)聯(lián)匯編的格式也變得讓人生畏了,感覺既不像C語言,也不像匯編語言,似乎是一種中間產(chǎn)物,不信您看:
asm [volatile] (“assembly code” : output : input : clobber/modify)
和前面的基本內(nèi)聯(lián)匯編相比,擴展內(nèi)聯(lián)匯編在圓括號中變成了4部分,多了output,input,和clobber/modify三項。其中的每一部分都可以省略,甚至包括assembly code。省略的部分要保留冒號分隔符來占位,如果省略的是后面的一個或多個連續(xù)的部分,分隔符也不用保留,比如省略了clobber/modify,不需要保留input后面的冒號。
assembly code:還是用戶寫入的匯編指令,和基本內(nèi)聯(lián)匯編一樣。
匯編代碼的運行是需要輸入?yún)?shù)的,其運行之后也可產(chǎn)出結(jié)果。
在C代碼中內(nèi)嵌匯編的目的是讓匯編幫助C完成某些功能,所以C代碼就要為其提供參數(shù)和用于存放其輸出結(jié)果的空間。這樣一來,內(nèi)聯(lián)匯編代碼類似機器,C代碼類似人。機器要運行,人就要為機器提供加工的源材料(input),機器運行后,將生產(chǎn)出來的成果放到人能夠得著的地方(output),人才能獲取機器的輸出結(jié)果。input和output正是C為匯編提供輸入?yún)?shù)和存儲其輸出的部分,這是匯編與c交互的關(guān)鍵,我們之前的討論就通過這兩項解決。
output:output用來指定匯編代碼的數(shù)據(jù)如何輸出給C代碼使用。內(nèi)嵌的匯編指令運行結(jié)束后,如果想將運行結(jié)果存儲到c變量中,就用此項指定輸出的位置。output中每個操作數(shù)的格式為:
”操作數(shù)修飾符 約束名”(C變量名)
其中的引號和圓括號不能少,操作數(shù)修飾符通常為等號’=’。多個操作數(shù)之間用逗號’,’分隔。
input:input用來指定C中數(shù)據(jù)如何輸入給匯編使用。要想讓匯編使用c中的變量作為參數(shù),就要在此指定。input中每個操作數(shù)的格式為:
”[操作數(shù)修飾符]?約束名”(C變量名)
其中的引號和圓括號不能少,操作數(shù)修飾符為可選項。多個操作數(shù)之間用逗號’,’分隔。
單獨強調(diào)一下,以上的output()和input()括號中的是C代碼中的變量,output(c變量)和input(c變量)就像c語言中的函數(shù),將C變量(值或變量地址)轉(zhuǎn)換成匯編代碼的操作數(shù)。
clobber/modify:匯編代碼執(zhí)行后會破壞一些內(nèi)存或寄存器資源,通過此項通知編譯器,可能造成寄存器或內(nèi)存數(shù)據(jù)的破壞,這樣gcc就知道哪些寄存器或內(nèi)存需要提前保護起來,后面會展開細(xì)說。
assembly code中引用的所有操作數(shù)其實是經(jīng)過gcc轉(zhuǎn)換后的復(fù)本,“原件”都在output和input括號中的c變量,后面通過各種例子您就明白了。
總結(jié)
以上是生活随笔為你收集整理的一步步编写操作系统81 att内嵌汇编语法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 弥补小米12 Pro遗憾 小米12S P
- 下一篇: 我国将建立全球黄金储备中心,那存在美国的