庫函數API和C語言彙編語言混合式編程

  C語言代碼內嵌彙編的方法:app

在C語言文件中以以下格式加入彙編代碼
__asm__(
「彙編語句模板」
:輸出部分
:輸入部分
:「破壞描述部分」
)
asm能夠由__asm__代替,爲其別名。
可加上__volatile__表示不須要編譯器優化代碼。
用雙下劃線起始或結尾。
全部彙編語句在雙引號內,並以\n\t結束每一行。
$後跟當即數。
寄存器用%%+寄存器名錶示:%%eax
參數用%+參數序號表示:%0 , %1 。。。
輸入輸出部分跟在語句後,用()表示,每一行前有「:」符號
參數序號與參數出現順序一一對應。
參數前能夠跟說明符,用「   」表示,經常使用限定符意義以下
具體寄存器
a,b,c,d   將變量放入eXx
s  D      將變量放入esi   edi
q          將變量放入e(a,b,c,d)x中的任一個
r          將變量放入(a,b,c,d,s,d)中任一個
A         把eax和edx合成一個64的寄存器
 
內存
m        內存變量
o         內存變量,尋址方式是偏移量類型
V         內存變量,尋址方式不是偏移量類型
,        內存變量,尋址方式爲自動增量
p         操做數是一個合法的內存地址
寄存器或內存
g         將輸入變量放入eax,ebx,ecx,edx中的一個或做爲內存變量
X         操做數爲任何類型
當即數
I         0-31之間的當即數(用於32位移位指令)
J         0-63當即數(用於64)
N       0-255當即數(用於out指令)
i         當即數
n        當即數,對不支持數字之外當即數的系統使用
操做數類型
=       只寫(輸出)
+       讀寫類型(輸入輸出操做數)
浮點數
f        浮點數
t        第一個浮點寄存器
u       第二個浮點寄存器
G      標準的80387(指協處理器浮點運算部件80387)
%     該操做數可與下一個操做數交換位置
#      部分註釋,從該字符到後面逗號以前的全部內容被忽略
\*     選用寄存器,則其後字母被忽略
匹配
「0」、「1」。。。「9」
表示被限制的操做數與某個指定的操做數匹配
如下面的程序爲例講一下應用:
 1 #include<stdio.h>
 2 #include <unistd.h>
 3 int main()
 4 {
 5 int a,b;
 6 pid_t t,asm_t;
 7 t =getpid();
 8 a = t;
 9 printf("pid = %d\n",a);
10 asm volatile(
11 "mov $0x14,%%eax\n\t"
12 "int $0x80\n\t"
13 "mov %%eax,%0\n\t"
14 :"=m"(asm_t)
15 );
16 b = asm_t;
17 printf("asm_t = %d\n",b);
18 return 0;
19 }

 

程序裏面用到了系統調用getpid。它的原型是:
pid_t getpid(void)
getpid的調用編號爲20(0x14),全部系統調用的編號能夠在unistd.h文件裏找到。
發起系統調用的過程爲:
  • 應用程序經過調用C語言函數庫中的外殼函數(wrapper),發起系統調用
  • 外殼函數必須保證全部的系統調用參數可用,這些參數經過堆棧傳入外殼函數,內核但願將這些參數置入通用寄存器。所以,外殼函數會將上述參數複製到寄存器,個數不超過6個(ebx,ecx,edx,esi,edi,ebp)每一個參數長度不超過寄存器的位數--32位。
  • 爲了 讓內核能區分每一個系統調用,外殼函數會將系統調用編號複製到特定的通用寄存器中-->%eax
  • 在此以後,外殼函數執行一條中斷指令,引起用戶態到核心態的切換,並執行系統中斷0x80(128d)的中斷矢量所指向的代碼
  • 內核調用system_call以響應0x80中斷,過程以下:
  1. 在內核棧中保存寄存器值
  2. 審覈調用編號的有效性
  3. 以系統調用編號對存放全部調用服務程序的列表(sys_call_table)進行索引,查找並調用相應的系統調用服務程序。若服務程序須要參數,則檢查參數的有效性。
  4. 從內核棧中恢復各寄存器值,將系統調用返回置於棧中。
  5. 返回至外殼函數,同時將處理器切換回用戶態
  • 若系統調用的返回值代表調用有誤,外殼函數會使用該值設置全局變量errno,無誤則返回調用程序,並返回一個整型值,代表系統調用是否成功。
執行結果以下:

by 崑崙雪狐函數

原創做品轉載請註明出處優化

《Linux內核分析》spa

MOOC課程http://mooc.study.163.com/course/USTC-1000029000code

相關文章
相關標籤/搜索