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