大会,你好世界问题

我在 Linux上学习asm(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

这是一个简单的问候世界.在Linux上运行直接调用内核(显然).
任何人都可以解释这里真正发生的事情吗?我认为它读取了eax&中的整数. ebx处理器寄存器& ecx,edx数据,它定义了调用内核时的系统调用.如果是这样,当调用int 0x80时,不同的整数组合是否定义了不同的系统调用?

我对man页面不太满意,但是已经阅读了我能找到的每一个相关的页面,是否有任何man page告诉我哪些组合定义了什么系统调用?

任何帮助表示赞赏.一行一行的解释会很棒……
-提前致谢
杰里米

当调用int 0x80时,内核会查看eax寄存器的值以确定要调用的函数(这是“系统调用号”).根据该数字,其余的寄存器被解释为具体的东西. sys_write调用期望寄存器设置如下:

> eax包含4
> ebx包含文件描述符
> ecx包含要写入的数据的地址
> edx包含字节数

有关更多详细信息,请参阅Linux System Calls.

相关文章
相关标签/搜索