我目前正在尝试学习使用ArchLinux的x86体系结构进行汇编编程。我刚刚开始这段旅程,并了解以下打印Hello World
程序的内部工作原理。
; Jon Webb
; December 31, 2021
; ==============================================================================
; ==============================================================================
; Data Section
section .data
; Message to be printed
msg: db "Hello World", 10
; Length of message
len: equ $ - msg
; ==============================================================================
; Code section
section .text
; Define entry point
global _start
_start:
; 4 is equivalent to sys_write(std_output, msg, len)
mov eax, 4 ; Calls sys_write function from syscall
mov ebx, 1 ; File descriptor (1 standard output)
mov ecx, msg ; Message to be printed
mov edx, len ; Length of message to be printed
int 0x80 ; Make syscall
; 1 is equivalent to sys_exit(status)
mov eax, 1 ; Specify exit syscall
mov eab, 0 ; Pass a status code of zero which indicates successful conclusion
int 0x80 ; Make syscall
; ==============================================================================
; ==============================================================================
; end of file
我理解这个代码是如何工作的。该代码调用两个Linux系统调用函数sys_write()
和sys_exit()
,这两个函数分别由整数4和1定义。在每个函数中,我通过将其定义整数传递给eax来调用该函数,然后将连续的变量传递给ebx、ecx、edx等等。在这种情况下,我知道这两个函数,因为我正在读的书告诉我,4表示sys_write
,1表示sys_exit
;然而,我怀疑它们还有其他类似的功能。在哪里可以获得所有Linux系统调用函数的列表。我原以为这会是一个简单的答案,通过简单的谷歌搜索,但到目前为止,我几乎没有得到什么。这是x86汇编编程的一个基本方面,尽管这些函数会在教程中列出,但到目前为止,我还没有发现这是真的。
strace有列出这些表的表。您可以在此处找到x86_64调用。