2.2.1內嵌彙編

內容來源於《庖丁解牛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

  1. __asm__是GCC關鍵字asm的宏定義,是內嵌彙編的關鍵字,表示這是一條內嵌彙編語句。__asm__asm能夠互相替換使用:#define __asm__ asm
  2. __volatile__是GCC關鍵字volatile的宏定義,告訴編譯器不要優化代碼,彙編指令保留原樣。__volatile__volatile能夠互相替換使用:#define __volatile__ volatile
  3. 內嵌彙編關鍵字asm volatile的括號內部第一部分是彙編代碼,即前四句雙引號代碼。
    • 寄存器前會多一個%轉義符號,即兩個%(%%)
    • %數字表示後面輸出部分、輸入部分、破壞性描述部分的編號。按照這幾部分裏變量的出現順序從0開始編號,具體來講%0表示變量val3%1表示變量val1%2表示變量val2(注意並非按照前面c語言的聲明順序)
    • 注意%數字$數字區分,後者纔是當即數的意思
  4. 先解釋後面的輸出輸入部分,前面的彙編代碼部分就能理解了。
    • 輸出輸入部分以:開頭,這點和彙編代碼部分不同。
    • 大致的規則是:: "位置" (c上下文的變量名),其中位置裏m表示memory,c表示ecx寄存器,d表示edx寄存器;經過上面說的%數字將彙編和C語言變量名進行綁定。=表示輸出。
    • 沒有輸出/輸入也要有:來佔行佔位。

所以,能夠把這個模型的內嵌彙編當作是一個函數,第一部分是函數體,第二部分是返回值,第三部分是參數列表。input

相關文章
相關標籤/搜索