大会,你好世界问题

Jer*_*emy 8 x86 assembly system-calls linux-kernel

我在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
Run Code Online (Sandbox Code Playgroud)

这是一个简单的问候世界.Linux +上的运行直接调用内核(显然).有谁能解释一下这里到底发生了什么?我认为它读取eax&ebx处理器寄存器和ecx,edx数据中的整数,并在调用内核时定义系统调用.如果是这样,当调用int 0x80时,不同的整数组合是否定义了不同的系统调用?

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

任何帮助表示赞赏.逐行解释将是惊人的... - 谢谢提前杰里米

Gre*_*ill 7

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

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

有关更多详细信息,请参阅Linux系统调用.