一步步编写操作系统 77 内联汇编与ATT语法简介
內(nèi)聯(lián)匯編
之前和大家介紹過(guò)了一種匯編方法,就是C代碼和匯編代碼分別編譯,最后通過(guò)鏈接的方式結(jié)合在一起形成可執(zhí)行文件。
另一種方式就是在C代碼中直接嵌入?yún)R編語(yǔ)言,強(qiáng)大的GCC無(wú)所不能,咱們本節(jié)要學(xué)習(xí)的就是這一種,它稱為內(nèi)聯(lián)匯編。
其實(shí)還有另外一種,就是那些技術(shù)大牛才能玩得轉(zhuǎn)的方式,將c代碼編譯為匯編代碼后,再修改匯編代碼。
什么是內(nèi)聯(lián)匯編
內(nèi)聯(lián)匯編稱為inline assembly,GCC支持在C代碼中直接嵌入?yún)R編代碼,所以稱為GCC inline assembly。大家知道,C語(yǔ)言不支持寄存器操作,匯編語(yǔ)言可以,所以自然就想到了在C語(yǔ)言中嵌入內(nèi)聯(lián)匯編提升“戰(zhàn)斗力”的方式,通過(guò)內(nèi)聯(lián)匯編,C程序員可以實(shí)現(xiàn)C語(yǔ)言無(wú)法表達(dá)的功能,這樣使開發(fā)能力大為提升。
內(nèi)聯(lián)匯編按格式分為兩大類,一類是最簡(jiǎn)單的基本內(nèi)聯(lián)匯編,另一類是復(fù)雜一些的擴(kuò)展內(nèi)聯(lián)匯編,在介紹它們之前,其實(shí)還有一點(diǎn)點(diǎn)頭疼的事,內(nèi)聯(lián)匯編中所用的匯編語(yǔ)言,其語(yǔ)法是AT&T,并不是咱們熟悉的Intel匯編語(yǔ)法,GCC只支持它,所以咱們還得了解下AT&T。
AT&T語(yǔ)法簡(jiǎn)介
我們?cè)诖髮W(xué)所學(xué)習(xí)的匯編語(yǔ)言大多數(shù)都是intel語(yǔ)法,也許這和教學(xué)系統(tǒng)都是微軟的操作系統(tǒng)dos和windows有關(guān),翻翻過(guò)去的教材,一律全是dos下匯編或windows下匯編。linux內(nèi)核中的匯編代碼一般都是AT&T語(yǔ)法,我想,隨著linux普及,以后在教學(xué)中會(huì)越來(lái)越多采取AT&T語(yǔ)法啦。
AT&T是匯編語(yǔ)言的一種語(yǔ)法風(fēng)格、格式。在某一處理器平臺(tái)上,無(wú)論匯編代碼是什么語(yǔ)法,其編譯出來(lái)的機(jī)器碼是一樣的,所以不要誤以為AT&T是一種新的機(jī)器語(yǔ)言。它僅僅是表達(dá)方式不同,意思是一樣的,這就像咱們漢語(yǔ)中,比如,“我今天與賀亞濤在食堂吃飯”,“今天在食堂,賀亞濤和我一起吃飯”,都表達(dá)的是同一個(gè)意思。
AT&T首先在Unix中使用,可當(dāng)初Unix并不是在x86處理器上開發(fā)的,最初是在PDP-11機(jī)器上開發(fā),后來(lái)又移植到VAX和68000的處理器上,所以AT&T的語(yǔ)法自然更接近于這些處理器的特性。雖然unix后來(lái)又移植到x86上了,但還是要尊重unix圈內(nèi)的習(xí)慣,其匯編語(yǔ)法還是接近于那些前輩處理器上的語(yǔ)法,這就是AT&T語(yǔ)法。
無(wú)論語(yǔ)法再怎么變,匯編語(yǔ)言中指令關(guān)鍵字肯定不能有太大出入,名字非常接近,只是在指令名字的最后加上了操作數(shù)大小后綴,b表示1字節(jié),w表示2字節(jié),l表示4字節(jié)。比如壓棧指令,intel中是push,AT&T中是pushl,最后這個(gè)’l’表示壓入4字節(jié)(long型大小)。在了解intel匯編指令的情況下,基本上能夠看懂AT&T的匯編指令。它們的主要差別是語(yǔ)法風(fēng)格,咱們對(duì)照著看下這兩種風(fēng)格的區(qū)別吧。
圖1
圖1續(xù)
好了,下節(jié)再說(shuō),哥下班回家了。
總結(jié)
以上是生活随笔為你收集整理的一步步编写操作系统 77 内联汇编与ATT语法简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浦发信用卡里程银行有啥用
- 下一篇: java信息管理系统总结_java实现科