在linux內核代碼中,經常看到asmlinkage限定詞,例如:asmlinkage long sys_getpid(void)等,介紹如下:
asmlinkage 的定義(/usr/include/asm/linkage.h裏面):
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
__attribute__是關鍵字,是gcc的C語言擴展,regparm(0)表示不從寄存器傳遞參數
如果是__attribute__((regparm(3))),那麼調用函數的時候參數不是通過棧傳遞,
而是直接放到寄存器裏,被調用函數直接從寄存器取參數。
彙編語言的主程序與子程序之間的參數傳遞方式:轉載自:點擊打開鏈接
主程序在調用子程序之前,必須要吧需要子程序處理的原始數據傳遞給子程序,即爲子程序準備入口參數。
常見的的參數傳遞有4種
1.寄存器法
寄存器法就是將入口參數和出口參數存放在約定的寄存器中。
優點:數據傳遞書讀快、編程較方便、節省內存單元。
缺點:當傳遞參數過多時候(PS:參數大於4個時,必須使用堆棧法),由於寄存器個數有限,及寄存器的頻繁使用,將導致寄存器不足。
適用:參數較少的子程序
2。約定單元法:
約定單元法顧名思義是吧入口參數和出口參數都放在事先約定好的單元中
優點:不佔用寄存器、參數個數任意、每個子程序要處理的數據和送出的結構都有獨立的存儲單元
缺點:但用一定數量的存儲單元,增加編程中對變量定義的難度
3.堆棧法
堆棧法是利用堆棧來傳遞參數的。
優點:參數不佔用寄存器,和存儲單元。參數存放在公共堆棧區,處理完後客恢復。參數個數一般不限
缺點:由於參數和子程序混雜在一起,存取參數時候必須小心計算它在堆棧中的位置。要注意斷點的保存和恢復。
4.地址表法
這種方法是把參數組成的一張參數表放在某個存儲區中,然後只要主程序和子程序約定好這個存儲區的首地址和存放的內容,在主程序中將參數傳遞給地址表,在子程序中根據地址表給定的參數就可以完成操作。
c、pascal等採用堆棧法傳遞參數
當彙編語言編寫的程序要調用其他語言編寫的子程序代碼時候,或爲其他語言提供子程序模塊時候,彙編語言編寫的程序必須遵守對應的高級語言的參數傳遞規則。改原則在彙編語言和其他語言混編時候必須遵守