linux源碼閱讀筆記 asm函數

來源:互聯網
上載者:User

標籤:

在linux源碼中經常遇到__asm__函數。它其實是函數asm的宏定義

#define __asm__ asm,asm函數讓系統執行彙編語句。

__asm__常常與__volatile__一起出現。__volatile__限制編譯器不能對下面的彙編語句進行最佳化處理。

分析下面語句

__asm__("movb %3,%%dh\n\t" \
 "movb %2,%%dl\n\t" \
 "shll $16,%%edx\n\t" \
 "movw %1,%%dx" \
 :"=d" (__base) \
 :"m" (*((addr)+2)), \
 "m" (*((addr)+4)), \
 "m" (*((addr)+7))); \
 __base;})

首先它的基本格式為:

__asm__ ("InstructionList"
                                    :Output
                                    :Input
                                    :Clobber/Modify);

%0,%1,%2,%3分別對應OutPut和Input中出現的運算元,稱為預留位置。在此例中,對應關係如下:

%0       __base

%1      (*((addr)+2))

%2      (*((addr)+4))

%3      (*((addr)+7))

這樣的預留位置最多有10個。在運算元之前還有一個字串,該字串表示將運算元放入對應的位置進行處理。

例如,"=d" (__base),表示將運算元__base放入寄存器%edx。也就是%edx代表了__base,=表示該運算元是WRITE—ONLY的。

而"m"表示記憶體。這就是所謂的操作約束。

具體的寄存器縮寫以及各個符號的含義見下。

 

 

每一個Input和Output運算式都必須指定自己的操作約束Operation Constraint,這裡將討論在80386平台上所可能使用的操作約束。

當前的輸入或輸出需要藉助一個寄存器時,需要為其指定一個寄存器約束,可以直接指定一個寄存器的名字。

常用的寄存器約束的縮寫 
約束        意義
r            表示使用一個通用寄存器,由 GCC  在%eax/%ax/%al,%ebx/%bx/%bl,%ecx/%cx/%cl,%edx/%dx/%dl中選取一個GCC認為合適的。
g           表示使用任意一個寄存器,由GCC在所有的可以使用的寄存器中選取一個GCC認為合適的。
q           表示使用一個通用寄存器,和約束r的意義相同。
a           表示使用%eax/%ax/%al
b           表示使用%ebx/%bx/%bl
c           表示使用%ecx/%cx/%cl
d           表示使用%edx/%dx/%dl
D          表示使用%edi/%di
S           表示使用%esi/%si
f            表示使用浮點寄存器
t            表示使用第一個浮點寄存器
u           表示使用第二個浮點寄存器

如果一個Input/Output  動作表達式的C/C++運算式表現為一個記憶體位址,不想藉助於任何寄存器,則可以使用記憶體約束。比如:
__asm__("lidt%0":"=m"(__idt_addr));
__asm__("lidt%0"::"m"(__idt_addr));

 

修飾符     輸入/輸出      意義
=                 O               表示此Output動作表達式是Write-Only的。
+                 O               表示此Output動作表達式是Read-Write的。
&                 O               表示此Output動作表達式獨佔為其指定的寄存器。
%                I                 表示此Input  動作表達式中的C/C++運算式可以和下一 個Input動作表達式中的C/C++運算式互換

linux源碼閱讀筆記 asm函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.