Assembly 大会,你好,世界问题

Assembly 大会,你好,世界问题,assembly,x86,linux-kernel,system-calls,Assembly,X86,Linux Kernel,System Calls,我正在学习Linux上的asm(noobuntu 10.04) 我从中获得了以下代码: 这是一个简单的你好世界。在Linux+上运行直接调用内核(显然)。 谁能解释一下这里到底发生了什么?我认为它读取eax&ebx处理器寄存器&ecx,edx数据中的整数,并在调用内核时定义系统调用。如果是这样,当调用int 0x80时,不同的整数组合是否定义了不同的系统调用 我不擅长使用手册页,但已经阅读了我能找到的所有相关手册页,有没有手册页告诉我什么组合定义了什么系统调用 感谢您的帮助。一行一行的解释将是惊

我正在学习Linux上的asm(noobuntu 10.04) 我从中获得了以下代码:

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

我不擅长使用手册页,但已经阅读了我能找到的所有相关手册页,有没有手册页告诉我什么组合定义了什么系统调用

感谢您的帮助。一行一行的解释将是惊人的。。。 -提前谢谢
Jeremy

调用
int0x80
时,内核会查看
eax
寄存器的值,以确定要调用的函数(这是“系统调用号”)。根据该数字,其余寄存器被解释为表示特定的内容。
sys\u write
调用要求寄存器设置如下:

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

有关更多详细信息,请参阅。

系统调用太多,因此每个调用都需要不同的汇编语言指令

相反,您可以调用TRAP指令。eax的值确定将调用哪个系统调用。其他寄存器是系统调用的参数

系统调用在内核中列出

section .text
global _start ;must be declared for linker (ld)
这只是标题材料,汇编程序的“文本”部分只是机器指令(相对于数据、只读数据和BSS部分)。
global
行类似于说
\u start
函数是“public”

从评论中我们知道我们正在查看
sys\u write
函数,因此我们可以
man2 write
来获取详细信息。C原型提供以下参数:
fd
*buf
count
。从%ebx开始,我们看到这些匹配(%ebx=fd,%ecx=string to write,%edx=string的长度)。然后,由于我们是一个用户进程,我们必须要求内核执行输出。这是通过SYSCALL接口完成的,并且
write()
函数(显然)被赋予了数字4
int0x80
是一种调用Linux内核系统调用例程的软件中断

您可以在Linux头文件中找到所有系统调用的实际数量(假设已安装)。在我的系统上,我选中了
/usr/include/sys/syscall.h
导致
/usr/include/asm/unistd.h
,然后转到
/usr/include/asm-i386/unistd.h
。其中(我明白了),
\define\uu NR\uwrite 4

mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
与前一段的最后两行一样,这只是加载系统调用id,并执行软件中断以退出程序(删除其内存映射和清理)


这是数据部分,它只描述了我们在程序中使用的变量。

非常感谢,这是我的怀疑,尽管如此还是很有帮助的。。。你能告诉我在哪里可以学到更多吗?这些系统调用整数在手册页中吗?您必须深入到Linux源头文件中才能找到系统调用号。我现在手头没有Linux机器,所以我无法告诉您确切的位置,但它类似于内核源代码树中的
include/asm/syscall.h
。谢谢。在内核中,我应该在哪里查看系统调用?
_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