汇编语言调用Linux系统调用
首先查找系統調用文件
#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<unistd.h> //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系统调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从1的补码说起计算机的数制
- 下一篇: C语言不要重复包含.h头文件和.c文件