• <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>

            jake1036

            Linux內核完全剖析之讀書筆記<二>

                  
                                                                                        C語言與匯編語言的相互調用
               1 GNU可以把一些變量值放在CPU寄存器中,即所謂寄存器變量, 節(jié)省了CPU訪問存儲器的時間。
                  在嵌入?yún)R編語句中把匯編指令的輸出直接寫到指定的寄存器中,那么此時應該使用局部寄存器變量。
                  在linux內核中只會使用局部寄存器變量。 
                      
                  在GNU C程序中我們在函數(shù)中定義了一個局部寄存器變量如下:
                     register int res  _asm_   ("ax") ;
                    變量res 希望使用的寄存器是 eax 。 但是變量不一定會存儲在該寄存器中,但是如果該變量用作asm的操作數(shù),
                    那么還是能夠保證指定的寄存器被用作該操作數(shù)。

             內聯(lián)函數(shù) 
                 在程序中,一個函數(shù)若聲明為Inline,那么就可以讓gcc把函數(shù)的代碼集成到調用該函數(shù)的代碼中去。
                  這樣處理就會節(jié)省函數(shù)調用時進入/退出的時間開銷。

            3 C與匯編函數(shù)的相互調用      
                  (1) 棧幀結構和控制轉移權方式 
                      CPU使用棧來支持函數(shù)調用操作,棧被用來傳遞參數(shù)、存儲返回信息、臨時保存寄存器原有值和存儲局部數(shù)據(jù)。 
                      單個函數(shù)調用操作所使用的部分被稱為棧幀結構。
                      棧幀結構由兩個指針指定,esp為棧指針,ebp為幀指針。 
                    
               
                




               棧是往小的地方擴展,esp指向當前棧頂?shù)脑兀ㄟ^使用push和pop可以完成數(shù)據(jù)的出入棧操作。


             4 指令CALL 和 指令RET
                指令CALL的作用是把返回地址壓入棧中,并且跳轉到被調用函數(shù)開始處執(zhí)行。
               返回地址是指的是 緊隨調用CALL后面一條指令的地址,因此當被調函數(shù)返回時,就會從該位置繼續(xù)執(zhí)行。
              
               RET指令用于彈出棧頂處的指針并跳到該地址處。在使用該指令之前,首先應該正確處理棧中的內容,使得
              當前棧指針所指位置的內容正好是先前CALL指令所保存的返回地址。   另外如果返回值是一個整數(shù)或者是指針的話,
              那么寄存器eax將被默認用來傳遞返回值。 
             
            5 在匯編語言中調用C 函數(shù)

               調用方法如下: 
                程序需要首先按照逆向的順序把函數(shù)參數(shù)壓入到堆棧中,即函數(shù)的最右邊一個先入棧,
                而最左邊的一個參數(shù)在最后調用指令之前入棧。
                 函數(shù)調用棧如下:

                 
                 
                由上圖可知一旦參數(shù)壓棧完畢,則隨之將CALL指令后的一個指令地址壓棧(即Return Address的值)。




               








              















            posted on 2010-09-16 10:27 kahn 閱讀(525) 評論(0)  編輯 收藏 引用

            成人妇女免费播放久久久| 青青热久久国产久精品 | 99久久无色码中文字幕| 久久久中文字幕| 亚洲精品成人网久久久久久| 浪潮AV色综合久久天堂| 国产精品美女久久久免费| 无码专区久久综合久中文字幕 | 久久久久亚洲AV综合波多野结衣 | 国产91久久精品一区二区| 久久久久国产日韩精品网站| 久久综合久久自在自线精品自| 精品久久久久久无码人妻蜜桃| 亚洲国产精品久久电影欧美| 久久久中文字幕日本| 精品久久久久久成人AV| 久久强奷乱码老熟女网站 | 亚洲欧美精品一区久久中文字幕| 久久精品欧美日韩精品| 97久久国产露脸精品国产| 久久久国产精华液| 精品人妻伦一二三区久久| 久久99国产综合精品女同| 久久狠狠爱亚洲综合影院| 久久天天日天天操综合伊人av| 久久精品嫩草影院| 国产精品久久久久久福利漫画 | 亚洲七七久久精品中文国产| 99热都是精品久久久久久| 国产一区二区三区久久| 成人久久久观看免费毛片| 狠狠干狠狠久久| 91超碰碰碰碰久久久久久综合| 久久久一本精品99久久精品66 | 国产日产久久高清欧美一区| 无码久久精品国产亚洲Av影片| 亚洲午夜无码AV毛片久久| 久久久午夜精品| 无码AV波多野结衣久久| 国产美女久久精品香蕉69| 国产欧美久久久精品|