我正在学习Linux上的汇编语言(noobuntu 10.04)。我从http://asm.sourceforge.net/intro/hello.html获取了以下代码:
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
这是一个简单的“Hello World”程序,可以在Linux上运行,并直接调用内核(显然)。 有人能解释一下到底发生了什么吗?我认为它读取了eax和ebx处理器寄存器以及ecx、edx数据中的整数,并在调用内核时定义了系统调用。如果是这样,当调用int 0x80时,不同的整数组合是否定义了不同的系统调用?
我对man手册不熟悉,但已阅读了所有相关的手册,在任何手册中都能找到哪些组合定义了哪些系统调用吗?
任何帮助都将不胜感激。逐行解释将非常神奇... -提前致谢 Jeremy
include/asm/syscall.h
。 - Greg Hewgill