青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 60, 文章 - 0, 評論 - 197, 引用 - 0
數據加載中……

GCC 內聯匯編

 
有時為了高效,有時為了直接控制硬件,有些模塊我們不得不直接用匯編語言來編寫,并且對外提供調用的接口,隱藏細節,這其實就是內聯匯編。如何使用內聯匯編?我們就以 GCC 為例,一窺其中奧秘!


一、關鍵字 
   
如何讓 GCC 知道代碼中內嵌的匯編呢? 借助關鍵字!來看下面的例子:

     __asm__ __volatile__("hlt");

  __asm__
表示后面的代碼為內嵌匯編,asm __asm__ 的別名。__volatile__ 表示編譯器不要優化代碼,后面的指令保留原樣,volatile 是它的別名。括號里面是匯編指令。

二、示例分析 
  
使用內嵌匯編,要先編寫匯編指令模板,然后將 C 語言表達式與指令的操作數相關聯,并告訴 GCC 對這些操作有哪些限制條件。示例如下:
 
   __asm__ __violate__ ("movl %1,%0" : "=r" (result) : "m" (input));   

    movl %1,%0  
是指令模板;%0   %1 代表指令的操作數,稱為占位符,內嵌匯編靠它們將C 語言表達式與指令操作數相對應。

   
指令模板后面用小括號括起來的是 C 語言表達式,本例中只有兩個:result input ,他們按照出現的順序分別與指令操作數 %0 %1 對應;注意對應順序:第一個 C 表達式對應 %0 ;第二個表達式對應 %1 ,依次類推,操作數至多有10 個,分別用 %0, %1 …. %9 表示。

   
在每個操作數前面有一個用引號括起來的字符串,字符串的內容是對該操作數的限制或者說要求。result 前面的限制字符串是 =r ,其中 = 表示 result 是輸出操作數, r  表示需要將 result 與某個通用寄存器相關聯,先將操作數的值讀入寄存器,然后在指令中使用相應寄存器,而不是 result 本身,當然指令執行完后需要將寄存器中的值存入變量 result ,從表面上看好像是指令直接對 result 進行操作,實際上 GCC 做了隱式處理,這樣我們可以少寫一些指令。 input 前面的 r 表示該表達式需要先放入某個寄存器,然后在指令中使用該寄存器參加運算。 

  C
表達式或者變量與寄存器的關系由 GCC 自動處理,我們只需使用限制字符串指導 GCC 如何處理即可。限制字符必須與指令對操作數的要求相匹配,否則產生的匯編代碼將會有錯,讀者可以將上例中的兩個 r,都改為 m (m表示操作數放在內存,而不是寄存器中),編譯后得到的結果是: 

           movl input, result

很明顯這是一條非法指令,因此限制字符串必須與指令對操作數的要求匹配。例如指令 movl 允許寄存器到寄存器,立即數到寄存器等,但是不允許內存到內存的操作,因此兩個操作數不能同時使用 m 作為限定字符。
內嵌匯編語法如下: 

           __asm__(
匯編語句模板: 輸出部分: 輸入部分: 破壞描述部分)

共四個部分:匯編語句模板,輸出部分,輸入部分,破壞描述部分,各部分使用“:”格開,匯編語句模板必不可少,其他三部分可選,如果使用了后面的部分,而前面部分為空,也需要用“:”格開,相應部分內容為空。例如: 

           __asm__ __volatile__("cli": : :"memory")

具體這幾部分都有什么限制呢?這得從細處著手!


三、語法細節
1
、匯編語句模板
   
匯編語句模板由匯編語句序列組成,語句之間使用“;”“\n” “\n\t” 分開。指令中的操作數可以使用占位符引用 C 語言變量,操作數占位符最多10 個,名稱如下:%0%1%9。指令中使用占位符表示的操作數,總被視為 long 型(4個字節),但對其施加的操作根據指令可以是字或者字節,當把操作數當作字或者字節使用時,默認為低字或者低字節。對字節操作可以顯式的指明是低字節還是次字節。方法是在 % 和序號之間插入一個字母,b 代表低字節,h 代表高字節,例如:%h1

2
、輸出部分
   
輸出部分描述輸出操作數,不同的操作數描述符之間用逗號格開,每個操作數描述符由限定字符串和 C 語言變量組成。每個輸出操作數的限定字符串必須包含“=”表示他是一個輸出操作數。 例如:
 
         __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x) )

描述符字符串表示對該變量的限制條件,這樣 GCC 就可以根據這些條件決定如何分配寄存器,如何產生必要的代碼處理指令操作數與 C 表達式或 C 變量之間的聯系。

3
、輸入部分
   
輸入部分描述輸入操作數,不同的操作數描述符之間使用逗號格開,每個操作數描述符由限定字符串和 C 語言表達式或者 C 語言變量組成。 示例如下:

1
 __asm__ __volatile__ ("lidt %0" : : "m" (real_mode_idt));

2
Static __inline__ void __set_bit(int nr, volatile void * addr)

       __asm__(
                       "btsl %1,%0"
                       :"=m" (ADDR)
                       :"Ir" (nr));
}

后例功能是將 (*addr) 的第 nr 位設為 1。第一個占位符 %0 語言變量 ADDR 對應,第二個占位符 %1 C 語言變量 nr 對應。因此上面的匯編語句代碼與下面的偽代碼等價:btsl nr, ADDR,該指令的兩個操作數不能全是內存變量,因此將 nr 的限定字符串指定為“Ir”,將 nr 與立即數或者寄存器相關聯,這樣兩個操作數中只有 ADDR 為內存變量。

4
、限制字符
   
限制字符有很多種,有些是與特定體系結構相關,此處僅列出常用的限定字符和i386中可能用到的一些常用的限定符。它們的作用是指示編譯器如何處理其后的 C 語言變量與指令操作數之間的關系。

 

分類

限定符

描述

通用寄存器

“a”

將輸入變量放入eax

“b”

將輸入變量放入ebx

“c”

將輸入變量放入ecx

“d”

將輸入變量放入edx

“s”

將輸入變量放入esi

“d”

將輸入變量放入edi

“q”

將輸入變量放入eaxebxecxedx中的一個

“r”

將輸入變量放入通用寄存器,eax,ebx,ecx,edx,esi,edi之一

“A”

eaxedx合成一個64 位的寄存器(use long longs)

內存

“m”

內存變量

“o”

操作數為內存變量,但其尋址方式是偏移量類型, 也即基址尋址

“V”

操作數為內存變量,但尋址方式不是偏移量類型

“ ”

操作數為內存變量,但尋址方式為自動增量

“p”

操作數是一個合法的內存地址(指針)

寄存器或內存

“g”

將輸入變量放入eaxebxecxedx之一,或作為內存變量

“X”

操作數可以是任何類型

立即數

“I”

0-31之間的立即數(用于32位移位指令)

“J”

0-63之間的立即數(用于64位移位指令)

“N”

0-255之間的立即數(用于out指令)

“i”

立即數

“n”

立即數,有些系統不支持除字以外的立即數,則應使用“n”而非 “i”

匹配

“ 0 ”

表示用它限制的操作數與某個指定的操作數匹配

“1” ...

也即該操作數就是指定的那個操作數,例如“0”

“9”

去描述1”操作數,那么“%1”引用的其實就是“%0”操作數,注意作為限定符字母的09 與指令中的0”9”的區別,前者描述操作數, 后者代表操作數。

&

該輸出操作數不能使用過和輸入操作數相同的寄存器

操作數類型

“=”

操作數在指令中是只寫的(輸出操作數)   

“+”

操作數在指令中是讀寫類型的(輸入輸出操作數)

浮點數

“f”

浮點寄存器

“t”

第一個浮點寄存器

“u”

第二個浮點寄存器

“G”

標準的80387浮點常數

%

該操作數可以和下一個操作數交換位置,例如addl的兩個操作數可以交換順序(當然兩個操作數都不能是立即數)

#

部分注釋,從該字符到其后的逗號之間所有字母被忽略

*

表示如果選用寄存器,則其后的字母被忽略



 5
、破壞描述部分
   
破壞描述符用于通知編譯器我們使用了哪些寄存器或內存,由逗號格開的字符串組成,每個字符串描述一種情況,一般是寄存器名;除寄存器外還有 “memory”。例如:“%eax”“%ebx”“memory” 等。

 

 

posted on 2008-02-26 15:20 Normandy 閱讀(8750) 評論(0)  編輯 收藏 引用 所屬分類: Programming

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜国产精品视频| 欧美精品v国产精品v日韩精品| 欧美主播一区二区三区| 亚洲素人一区二区| 亚洲一本视频| 欧美黄色aa电影| 久久夜色精品| 久久婷婷av| 欧美91视频| 亚洲人午夜精品免费| 亚洲国产另类精品专区| 亚洲美女少妇无套啪啪呻吟| 亚洲精品国产精品久久清纯直播 | 欧美成人免费在线| 欧美成人免费va影院高清| 欧美日本成人| 国产午夜精品视频免费不卡69堂| 国产一区二区剧情av在线| 狠狠久久亚洲欧美| 99re6热只有精品免费观看| 午夜精品在线| 亚洲国产高清自拍| 午夜一区在线| 欧美寡妇偷汉性猛交| 国产精品人人做人人爽| 亚洲福利视频在线| 亚洲一区二区三区四区五区黄 | 亚洲中午字幕| 蜜臀久久99精品久久久久久9 | 久久亚洲影音av资源网| 亚洲精品乱码久久久久| 欧美在线二区| 欧美三级午夜理伦三级中视频| 国产欧美一区二区精品忘忧草| 精品成人一区二区| 亚洲一区二区三区免费在线观看| 久久久久欧美| 在线亚洲免费| 女女同性精品视频| 黄色成人av网| 久久国产精品亚洲va麻豆| 亚洲日本欧美日韩高观看| 久久福利一区| 国产日产亚洲精品| 亚洲欧美一区二区三区久久| 亚洲激情视频在线| 欧美v国产在线一区二区三区| 国产美女一区| 欧美在线精品免播放器视频| 亚洲精品专区| 欧美另类99xxxxx| 亚洲精品在线二区| 亚洲黄色小视频| 欧美mv日韩mv国产网站app| 狠狠色伊人亚洲综合网站色| 亚洲国产精品视频| 亚洲一区二区三区四区在线观看 | 亚洲卡通欧美制服中文| 久久综合中文字幕| 久久精品91久久久久久再现| 国产精品美女久久久免费| 欧美激情欧美激情在线五月| 伊大人香蕉综合8在线视| 久久男人资源视频| 久久国产精品亚洲77777| 国产日韩一区二区三区在线播放| 亚洲欧美日韩国产一区| 亚洲视频一区二区在线观看| 国产精品久久久久久模特 | 欧美日韩美女在线| 亚洲天堂男人| 中文国产一区| 国产视频在线观看一区| 久久久久久九九九九| 久久成人羞羞网站| 在线日韩中文| 最新日韩精品| 国产精品成人国产乱一区| 午夜精品久久久久久99热软件| 亚洲午夜91| 一区在线视频观看| 欧美搞黄网站| 欧美午夜激情视频| 久久精品国产第一区二区三区最新章节| 亚洲男人的天堂在线观看| 国模套图日韩精品一区二区| 免费观看成人鲁鲁鲁鲁鲁视频 | 欧美成人免费在线| 欧美激情导航| 久久久久国产一区二区三区四区 | 国产精品成人在线| 久久国产加勒比精品无码| 久久不见久久见免费视频1| 影音先锋在线一区| 一区二区三区成人| 一区二区三区在线高清| 91久久久一线二线三线品牌| 国产精品久久久久久久午夜| 久久天天躁狠狠躁夜夜av| 欧美激情成人在线视频| 久久国产精品久久久久久电车| 欧美va天堂在线| 久久精品国产99| 久久一区二区精品| 欧美风情在线观看| 免费观看30秒视频久久| 亚洲一区二区三区乱码aⅴ| 久久精品五月婷婷| 亚洲欧美久久久久一区二区三区| 久久国产精品一区二区三区四区| 亚洲精品一二| 久久久www免费人成黑人精品| 亚洲一区二区三区影院| 久久亚洲捆绑美女| 久久精品综合| 国产日韩一区二区三区| 一本色道久久综合亚洲精品不卡 | 国产精品一区二区你懂的| 欧美激情一区在线观看| 国产日韩欧美一区在线 | 国产一区二区丝袜高跟鞋图片| 亚洲人成欧美中文字幕| 国产视频亚洲精品| 中日韩午夜理伦电影免费| 亚洲国产黄色| 久久精品主播| 久久成人亚洲| 国产色综合久久| 一区二区欧美精品| 亚洲一区二区精品视频| 欧美成人性网| 亚洲黄页视频免费观看| 在线看欧美日韩| 久久欧美肥婆一二区| 六月婷婷一区| 亚洲黄网站在线观看| 美女脱光内衣内裤视频久久网站| 久久久久久欧美| 狠狠网亚洲精品| 久久深夜福利| 亚洲第一中文字幕在线观看| 亚洲国产经典视频| 免费不卡在线视频| 亚洲成在人线av| 欧美国产日韩免费| 欧美韩日视频| 揄拍成人国产精品视频| 久久久久国产精品一区三寸| 久久久www成人免费无遮挡大片| 国产精品热久久久久夜色精品三区 | 亚洲欧美日韩精品一区二区| 小黄鸭精品密入口导航| 国产精品视频久久| 香蕉乱码成人久久天堂爱免费| 久久国产精品色婷婷| 国产综合婷婷| 欧美 日韩 国产在线| 亚洲国产精品女人久久久| 亚洲最新色图| 国产精品免费看久久久香蕉| 欧美亚洲一区二区三区| 美女免费视频一区| 日韩写真视频在线观看| 欧美午夜在线视频| 久久久夜精品| 免费av成人在线| 91久久中文| 新狼窝色av性久久久久久| 国产亚洲一级| 麻豆国产va免费精品高清在线| 亚洲三级视频| 久久se精品一区二区| 国内外成人免费视频| 美腿丝袜亚洲色图| 正在播放亚洲| 欧美激情区在线播放| 亚洲一区二区三区影院| 狠狠久久婷婷| 欧美视频在线观看一区二区| 欧美亚洲三级| 99精品99| 欧美成年人网站| 欧美中文字幕不卡| 99国产精品99久久久久久| 国产免费亚洲高清| 欧美国产日韩a欧美在线观看| 性伦欧美刺激片在线观看| 91久久精品美女| 久久嫩草精品久久久久| 亚洲色图制服丝袜| 亚洲国产欧美一区| 国产精品夜色7777狼人| 欧美另类视频在线| 久久精品夜色噜噜亚洲a∨| 99精品国产一区二区青青牛奶| 免费成年人欧美视频| 欧美一区二区视频在线| 亚洲性夜色噜噜噜7777| 日韩视频在线你懂得| 在线不卡中文字幕|