博主的另一篇博文介紹了如何使用int 0x80
指令進行linux系統呼叫,這一篇博文介紹一下如何使用另一種方式:syscall
指令進行linux系統呼叫,然後會簡要說明二者的不同。
通過syscall
指令進行linux系統呼叫與通過int 0x80
指令進行linux系統呼叫在使用上差別不大,系統呼叫號依然通過eax
傳遞,不同之處在於二者的系統呼叫號和傳遞引數所使用的暫存器。
通過syscall
指令進行linux系統呼叫時,約定的傳遞引數的暫存器依次為edi
、esi
、edx
、ecx
。文末會附上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...