版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
版本AT&T與 本節(jié)先介紹AT&T匯編語言語法與IN 語法。閱讀本節(jié)需要讀者具有IN AT&T與IN的匯編語言語法的區(qū)指令大小寫MOVEAX,movl%ebx, 格式的指令使用大寫字母,而AT&T格MOVEAX,movl%ebx,指令操作數(shù)賦值方向MOVMOVmovl指令前MOVmovl在IN 數(shù)需要加前綴“MOVmovlmovlvalue movl$value movlvalue movl$value RETFARSATCK_ADJUST
lcall$secion,$offsetljmp$secion,$offsetlret$stack_adjust間接尋址語 instr語法也不同,IN為Segreg:[base+index*scale+disp]AT&T中為%segreg:disp(base,index,sale)segreg,index,scale,dispindex而沒有顯式Scale的情況下使用默認(rèn)值1。Scale,disp instr指令后moval,blmovmoveax,dwordptrmovb%bl,%almovw%bx,%axmovl(%ebx),%eaxAT&T語法中大部分指令操作碼的最后一個(gè)字母表示操作數(shù)大小,“b”表示byte(一個(gè)字節(jié));“w”表示word(2,個(gè)字節(jié));“l(fā)”表示long(4,moval,blmovmoveax,dwordptrmovb%bl,%almovw%bx,%axmovl(%ebx),%eaxmovz((forwardb(bajmpjmpjmp指IN匯編與AT&T匯編指令基本相同,差別僅在語法上。關(guān)于每條指令的語法可以I386Manual。GCC內(nèi)嵌匯簡asm volatile("hlt");C語言編寫,只有一小部分使用匯編語言編寫,例如與特定體系結(jié)構(gòu)相關(guān)的代碼和對(duì)性能影響很大的代碼。asm volatile("hlt");“ 表示后面的代碼為內(nèi)嵌匯編,“asm”是“asm“volatilevolatile”是它的別名。內(nèi)嵌匯編舉語言表達(dá)式的值讀入哪個(gè)寄存器,以及如何將計(jì)算結(jié)果寫回C變量,你只要告訴程序中C使用內(nèi)嵌匯編,要先編寫匯編指令模板,然后將C語言表達(dá)式與指令的操作數(shù)相關(guān)聯(lián),asm asm violate ("movl%1,%0":"=r"(result):"r"CC語數(shù)“%0%1C%0%10%0%1”….“%9=rr”表示需要su”與某個(gè)通用寄存器相關(guān)聯(lián),先將操作數(shù)的值讀入寄存器,然后在指令中使用相應(yīng)寄存器,而不是“eu”本身,當(dāng)然指令執(zhí)行完后需要將寄存器中的值存入變量“resultCnurCgcc–c–SC文件源代碼相對(duì)應(yīng)的匯編代碼,然后查看一下匯編代碼,看看GCC是如何處理的。 intinput, intinput,result;voidtest(void){input= volatile("movl%1,%0":"=r"(result):"r"(input));}178 9 —串決定如何處理C表達(dá)式,本例兩個(gè)表達(dá)式都被指定為“r”型,所以先使用指令: input讀入寄存器GCC也指定一個(gè)寄存器與輸出變量result相關(guān),本例也是%eax,等得到操作結(jié)果后再 從上面的匯編代碼我們可以看出與result和input,相關(guān)連的寄存器都是%eax,GCC使用%eax替換內(nèi)嵌匯編指令模板中的%0,%1movl%eax,%eax這一句可以不要。由此可見,CGCC自動(dòng)處理,我們只需使用限制字movl 語asmasm輸入部分”要用“ volatile("cli":: volatile("cli"::匯編語句模板由匯編語句序列組成,語句之間使用“\n”或“\n\t”分開。指令中%9long型(4個(gè)字節(jié)但對(duì)其施加的操作根代表低字節(jié),“h%h1。輸出部分 volatile("pushfl; volatile("pushfl;popl%0;cli":"=g"(x)寄存器,如何產(chǎn)生必要的代碼處理指令操作數(shù)與C表達(dá)式或C變量之間的聯(lián)系。輸入部分由限定字符串和C語言表達(dá)式或者C語言變量組成。 volatile volatile("lidt%0"::"m"例二(bitops.h:StaticStaticinlinevoidset_bit(intnr,volatilevoid*{("btslbtslnr,btslnr,該指令的兩個(gè)操作數(shù)不能全是內(nèi)存變量,因此將nr的限定字符串指Ir”,將nr,與立即數(shù)或者寄存器相關(guān)聯(lián),這樣兩個(gè)操作數(shù)中只有ADDR為內(nèi)存變量。限制字符限制字符列表限制字符有很多種,有些是與特定體系結(jié)構(gòu)相關(guān),此處僅列出常用的限定字符和i386C語言變量與“b”將輸入變量放入ebx“sesi“q”將輸入變量放入eax,ebx,ecx “r”將輸入變量放入通用寄存器,也就是eax,ebx,ecx,edx,esi,edi中的一個(gè)“A”把eax和edx,合成一個(gè)64位的寄存器(uselonglongs)“,”操作數(shù)為內(nèi)存變量,但尋址方式為自動(dòng)增量“geax,ebx,ecx,edx中的一個(gè)或者作為內(nèi)存變量“I0-31之間的立即數(shù)(32位移位指令“J0-63之間的立即數(shù)(64位移位指令)“N”0-255,之間的立即數(shù)(用于out指令)“i”立即數(shù)0”,“1”,9”表示用它限制的操作數(shù)與某個(gè)指定的操作數(shù)匹配,也即該操作數(shù)就是0-9,與指令中的“%0”-“%9”的區(qū)別,前者描述操“G”標(biāo)準(zhǔn)的80387%該操作數(shù)可以和下一個(gè)操作數(shù)交換位#““r匹配限制符I386指令集中許多指令的操作數(shù)是讀寫型的(讀寫型操作數(shù)指先原來的值然后參加運(yùn)算,最后將結(jié)果寫回操作數(shù)addl1,%0,它的作用是將操作數(shù)%0與操作數(shù)%1的和存入操作數(shù)%0,因此操作數(shù)%0GCC對(duì)這種類型操作數(shù)的GCC中讀寫型的操作數(shù)需要在輸入和輸出部分符%0,%1,……%9C變量匹配。例如使用“0”作為%1的限制字符,那么%0和voidtest_at_t(){voidtest_at_t(){result=input= volatile("addl%1,%0":"=r"(result):} input為輸入型變量,而且需要放在寄存器中,GCC給它分配的寄存器是%edx,在執(zhí)行addl之前%edx的內(nèi)容已經(jīng)是input的值??梢妼?duì)于使用“r”限制的輸入型變量或者表達(dá)式,GCC會(huì)插入必要的代碼將他們的值讀到寄存器;“m”型變量則不需要這一步。讀入input后執(zhí)行addl,顯然%eax的值不對(duì),需要先讀入result的值才行。再往后看:movleax,%edxmovledx,_result的作用是將結(jié)果存回result,分配給result的寄存器與分配給input的一樣,都是%edx。但是在使用該寄存器之前并不將變量值先讀入寄存器,GCC認(rèn)為所有輸出變量以前的值都沒有用處,不讀入寄存器(AT&TCISC架構(gòu)處理CISCRISCr2對(duì)應(yīng)的操作數(shù)原來的值沒有用處,也就沒有必要先將操作數(shù)的值讀入r2,因?yàn)檫@是浪費(fèi)處理器的CPU周期GCC插入代碼,將寄存器的值寫回變量;為已經(jīng)不再使用。例如上例中的%edx。在執(zhí)行addlresult對(duì)應(yīng)的寄voidtest_at_t(){ = = volatile %2,}因?yàn)榈诙l,上面的內(nèi)嵌匯編指令不能奏效,因此需要在執(zhí)行addl之前把voidtest_at_t(){ = = volatile %2,} 看上去上面的代碼可以正常工作,因?yàn)槲覀冎?0和%1都和result addlresult的值被讀入了寄存器%edxaddl指令的操作數(shù)%0卻成了%eax,而不是%edxGCC給輸出和輸入部分的變量分配使用匹配限制符后,GCC知道應(yīng)將對(duì)應(yīng)的操作數(shù)放在同一個(gè)位置(同一個(gè)寄存器或者voidtest_at_t(){ = = volatile } 處理內(nèi)嵌匯編中輸出操作數(shù)的一點(diǎn)點(diǎn)信息:addl并沒有使用%edx,可見它不是簡單的用result對(duì)應(yīng)的寄存器%edx去替換%0,而是先分配一個(gè)寄存器,執(zhí)行運(yùn)算,最后才將運(yùn)算結(jié)GCC是先看該占位符對(duì)應(yīng)的變量的限制符,發(fā)現(xiàn)是一個(gè)輸出型寄CGCC知道還要將寄voidtest_at_t(){ =voidtest_at_t(){ = = volatile } “&”限制符 (“callfoo;movl (“callfoo;movl%%edx,%1”, ”r”(bar)movlmovlbar,%eaxcallmovl%edx,%eaxmovl%eax,_asm(“callfoo;movl%%edx,%1”,:”=&a”(ret) ”r”(bar)_asm(“callfoo;movl%%edx,%1”,:”=&a”(ret) ”r”(bar)破壞描述部分寄存器破壞描述符GCC并不知道)使用的寄存器。int{input=1; ("movl$0,movl%%eax,%1;\n\tmovl%2,%%eax;\n\tmovl%%eax,/*output /*inputreturn}在內(nèi)嵌的匯編指令中可能會(huì)直接某些寄存器,我們已經(jīng)知道int{input=1; ("movl$0,movl%%eax,%1;\n\tmovl%2,%%eax;\n\tmovl%%eax,/*output /*inputreturn} $0,%eax;movl%eax,-12(%ebp);movl%eax,%eax; $0,%eax;movl%eax,-12(%ebp);movl%eax,%eax;int{ =1; "movl$0,int{ =1; "movl$0,movl%%eax,movl%%eax,%1;\n\tmovl%2,%%eax;\n\tmovl%%eax,%0;\n\t" /*output /*input /*return}movlmovl$1,-$0,%eax,-%edx,%eax,- 匯編時(shí)請記住一點(diǎn):盡量告訴GCC盡可能多的信息,以防出錯(cuò)。譯器的優(yōu)化知識(shí),再看C關(guān)鍵字volatile。最后去看該描述符。編譯器優(yōu)化介紹內(nèi)存速度遠(yuǎn)不及CPU處理速度,為提高機(jī)器整體性能,在硬件上引入硬件高速緩沒有相關(guān)性的指令可以亂序執(zhí)行,以充分利用CPU的指令流水線,提高執(zhí)行速度。順序充分利用CPU指令流水線,常見的是重新排序讀寫指令。barrer,linux CDWORDstdcallthreadFunc(LPVOID{ DWORDstdcallthreadFunc(LPVOID{ return}gotogotogotothreadFuncintSignal前面加上volatile關(guān)鍵字,這時(shí)候,編譯器知道gotochara;c=0;test[0]=a=test:/*nooutput:"a"(c),"D"(test),"c":test[0]eteet(es,0100);stobtest數(shù)組的內(nèi)容,但是沒有在輸入或輸出部分去描述操作數(shù),因?yàn)檫@兩條指令都不需要顯式的指定操作數(shù),因此需要增加“eoryGCC?,F(xiàn)在假設(shè):GCC在優(yōu)化時(shí)將test[0]放到了%eax寄存器,那么test[0]=1對(duì)應(yīng)于%eax=1,a=test0]被換為aeaxeoyccest[0]的值已經(jīng)被改變(如果整段代碼都是我們自己使用匯編編寫,我們自己當(dāng)然知道這些內(nèi)存的修改情況,我們也可以人為的去優(yōu)化,但是現(xiàn)在除了我們編寫的那一小段外,其他匯編代碼都是GCC的,它并沒有那么智能,知道這段代碼會(huì)修改est[0],結(jié)果其后的a=est[0],轉(zhuǎn)換為匯編后卻是a=%eax,因?yàn)镚CC不知道顯式的改變了et數(shù)組,結(jié)果出錯(cuò)了。如果增加了“eory”修飾符,C(不會(huì)將讀寫操作映射到以前緩ax=1est[0]=1。intdel_timer(structtimer_list*{ ret= longflags; timer_list*next; ((next=timer->next)!=NULL) intdel_timer(structtimer_list*{ ret= longflags; timer_list*next; ((next=timer->next)!=NULL) =timer->prev=NULL; =}//} }timer->next的值,如果是空直接返回,無需進(jìn)行下面的操作。如果不是空,可能會(huì)被緩存到寄存器中,后面if((next=timer->next)!=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)人才2024年薪金聘用協(xié)議書版
- 二零二五版冷鏈物流車輛貨物運(yùn)輸安全協(xié)議2篇
- 二零二五年藝術(shù)品搬運(yùn)運(yùn)輸服務(wù)合同3篇
- 二零二五版數(shù)字經(jīng)濟(jì)產(chǎn)業(yè)發(fā)展合同范本2篇
- 2024施工合同匯集
- 二零二五年度鋼板租賃與節(jié)能減排服務(wù)協(xié)議3篇
- 個(gè)性化旅游顧問服務(wù)協(xié)議2024版版A版
- 2024版產(chǎn)品銷售協(xié)議6篇
- 二零二五年度高科技產(chǎn)業(yè)合伙人分家協(xié)議書3篇
- 二零二五年度智能工廠安全生產(chǎn)服務(wù)外包合同2篇
- 《用銳角三角函數(shù)解決問題(3)》參考課件
- 房地產(chǎn)營銷策劃 -佛山龍灣壹號(hào)學(xué)區(qū)房項(xiàng)目推廣策略提案方案
- 產(chǎn)品共同研發(fā)合作協(xié)議范本5篇
- 風(fēng)水學(xué)的基礎(chǔ)知識(shí)培訓(xùn)
- 2024年6月高考地理真題完全解讀(安徽?。?/a>
- 吸入療法在呼吸康復(fù)應(yīng)用中的中國專家共識(shí)2022版
- 1-35kV電纜技術(shù)參數(shù)表
- 信息科技課程標(biāo)準(zhǔn)測(2022版)考試題庫及答案
- 施工組織設(shè)計(jì)方案針對(duì)性、完整性
- 2002版干部履歷表(貴州省)
- DL∕T 1909-2018 -48V電力通信直流電源系統(tǒng)技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論