內容來源於《庖丁解牛Linux內核分析》-孟寧等
|-- 第2章操做系統是如何工做的
|--2.2藉助Linux內核部分源代碼模擬存儲程序計算機工做模型及時鐘中斷
|--2.2.1內嵌彙編windows
有修改,大部分同樣函數
C語言內嵌彙編語法以下:優化
__asm__ __volatile__ ( 彙編代碼 輸出部分 輸入部分 破壞性描述部分(能夠省略) );
下面經過一個簡單的例子來熟悉內嵌彙編的語法規則操作系統
#include <stdio.h> int main() { /* val1+val2=val3 */ unsigned int val1 = 1; unsigned int val2 = 2; unsigned int val3 = 0; printf("val1:%d,val2:%d,val3:%d\n", val1, val2, val3); asm volatile( "movl $0,%%eax\n\t" /* clear %eax to 0 */ "addl %1,%%eax\n\t" /* %eax += val1 */ "addl %2,%%eax\n\t" /* %eax += val2 */ "movl %%eax,%0\n\t" /* val2 = %eax */ : "=m" (val3) /* output =m mean only write output memory variable */ : "c" (val1), "d" (val2) /* input c or d mean %ecx/%edx */ ); printf("val1:%d+val2:%d=val3:%d\n", val1, val2, val3); return 0; }
這個例子是用匯編代碼是想val3=val1+val2
的功能(能在windows10, mingw-gcc上編譯運行正確),具體解釋以下code
__asm__
是GCC關鍵字asm
的宏定義,是內嵌彙編的關鍵字,表示這是一條內嵌彙編語句。__asm__
和asm
能夠互相替換使用:#define __asm__ asm
。__volatile__
是GCC關鍵字volatile
的宏定義,告訴編譯器不要優化代碼,彙編指令保留原樣。__volatile__
和volatile
能夠互相替換使用:#define __volatile__ volatile
。asm volatile
的括號內部第一部分是彙編代碼,即前四句雙引號代碼。
%
轉義符號,即兩個%
(%%
)%數字
表示後面輸出部分、輸入部分、破壞性描述部分的編號。按照這幾部分裏變量的出現順序從0開始編號,具體來講%0
表示變量val3
,%1
表示變量val1
,%2
表示變量val2
(注意並非按照前面c語言的聲明順序)%數字
和$數字
區分,後者纔是當即數的意思:
開頭,這點和彙編代碼部分不同。: "位置" (c上下文的變量名)
,其中位置裏m表示memory,c表示ecx寄存器,d表示edx寄存器;經過上面說的%數字
將彙編和C語言變量名進行綁定。=
表示輸出。:
來佔行佔位。所以,能夠把這個模型的內嵌彙編當作是一個函數,第一部分是函數體,第二部分是返回值,第三部分是參數列表。input