組合語言呼叫Linux系統呼叫

2021-06-12 01:27:21 字數 1326 閱讀 2293

首先查詢系統呼叫檔案

#find / -name unistd.h

/root/linux/include/unistd.h

/usr/include/linux/unistd.h

/usr/include/sys/unistd.h

/usr/include/bits/unistd.h

/usr/include/unistd.h

檢視系統呼叫值

/root/linux/include/unistd.h

#define __nr_setup  0   /* used only by init, to get system going */  

#define __nr_exit 1

#define __nr_fork 2

#define __nr_read 3

#define __nr_write 4

#define __nr_open 5

#define __nr_close 6

linux的exit

在linux中,這兩個函式都用於正常終止乙個函式。

但是函式_exit()直接是乙個sys_exit系統呼叫;

而函式exit()則通常是普通函式庫中的乙個函式,它會先執行一些清楚操作,例如呼叫執行各終止處理程式、關閉所有標準io等,然後再呼叫sys_exit。

_exit.c

#define _library_ //定義符號常量

#include//linux標準標頭檔案。定義了各種符號常數和型別,並宣告了各種函式(詳見標頭檔案);若定義了_library_,則還包括核心系統呼叫號和內嵌彙編_syscall0()等。

這是核心使用的程式(退出)或終止函式。

直接呼叫系統中斷int 0x80,功能號為_nr_exit。引數exit_code退出碼。關鍵字volatile用於告訴編譯器gcc該函式不會返回。

這樣可以讓gcc產生一些更好的**,更重要的使用這個關鍵字可以避免產生某些假警告資訊。

volatile void _exit(int exit_code)

_asm_("int $0x80"::"a"(_nr_exit),"b"(int exit_code));

這裡用到了嵌入彙編,這裡執行的動作就是呼叫系統中斷int 0x80,在呼叫系統中斷之前,將系統呼叫號_nr_exit放到暫存器eax中,退出碼exit_code放到暫存器ebx中。

用於關鍵字volatile告訴編譯器gcc告訴該函式沒有返回,所以在嵌入彙編中並沒有給出輸出暫存器。

組合語言學習筆記 使用Linux系統呼叫

一 linux系統呼叫 系統呼叫定義在 usr include a unistd.h 通常可以在man頁的第二部分檢視說明。e.g.man 2exit 二 使用系統呼叫 1 系統呼叫的格式 啟動系統呼叫需要使用int指令,linux系統呼叫位於中斷0x80。執行int指令時,所有操作轉移到核心中的系...

組合語言 函式呼叫棧

當發生函式呼叫的時候,棧空間中存放的資料是這樣的 1 呼叫者函式把被調函式所需要的引數按照與被調函式的形參順序相反的順序壓入棧中,即 從右向左依次把被調函式所需要的引數壓入棧 2 呼叫者函式使用call指令呼叫被調函式,並把call指令的下一條指令的位址當成返回位址壓入棧中 這個壓棧操作隱含在cal...

組合語言 子程式呼叫

不是很常用的 子程式返回指令 說明 根據段內和段間 有無引數,具體分成4種情況 1 ret 無引數返回 2 ret n 有引數返回 n引數的作用 需要彈出call指令壓入堆疊的返回位址 3 段內返回 偏移位址ip出棧 ip ss sp sp sp 2 4 段間返回 偏移位址ip和段位址cs出棧 ip...