Linux系統呼叫 使用syscall

2021-08-19 04:14:54 字數 1262 閱讀 5257

博主的另一篇博文介紹了如何使用int 0x80指令進行linux系統呼叫,這一篇博文介紹一下如何使用另一種方式:syscall指令進行linux系統呼叫,然後會簡要說明二者的不同。

通過syscall指令進行linux系統呼叫與通過int 0x80指令進行linux系統呼叫在使用上差別不大,系統呼叫號依然通過eax傳遞,不同之處在於二者的系統呼叫號和傳遞引數所使用的暫存器。

通過syscall指令進行linux系統呼叫時,約定的傳遞引數的暫存器依次為ediesiedxecx。文末會附上syscall使用的系統呼叫號表。

示例:

; nasm

; 在顯示器上輸出hello, world

; write(int fd, const void *buffer, size_t nbytes)

; exit(int status)

global _start

section .text

_start:

mov eax, 1

; write系統呼叫號為1

mov edi, 1

; 第乙個引數:檔案描述符(fd),1代表標準輸出stdout

mov esi, message ; 第二個引數:要輸出的位元組序列(buffer)

mov edx, message.len

; 第三個引數:位元組序列的長度

syscall

mov eax, 60

; exit系統呼叫號為60

mov edi, 0

; 第乙個引數:狀態碼(status),0代表正常退出

syscall

section .data

message:

db "hello, world", 10

.len equ $ - message

系統呼叫號不同(見文末系統呼叫表)

從內部機制來看

這是stack overflow的乙個問題,原問題位址為:what is better 「int 0x80」 or 「syscall」?

[1]syscall所使用的系統呼叫號表:linux系統呼叫號表

linux核心分析之sys c

include include include include include include include 這個檔案中包含了絕大部分系統呼叫函式的實現,如果系統呼叫在該核心版本中沒實現,就直接返回enosys int sys ftime int sys break int sys ptrace ...

使用linux系統呼叫ABI

void prints char str asm movl 4,eax n t movl 1,ebx n t movl 0,ecx n t movl 1,edx n t int 0x80 n t m str m i return intmain 這裡的關鍵在於linux系統0x80號中斷是32位系統...

linux 系統呼叫 open函式使用

函式介紹 本文僅僅將open系統呼叫的使用簡單總結一下,關於其實現原理大批的大佬分享可以自行學習。open系統呼叫主要用於開啟或者建立乙個檔案,並返回檔案描述符。以上兩個函式引數含義如下 返回值 作業系統會為當前程序從3開始分配乙個未使用的檔案描述符,因為0,1,2已經被stdin,stdout,s...