我正在阅读有关Linux中nasm编程的手册,有一件事我无法找到答案。
请考虑以下代码:
mov eax, 4
mov ebx, 1
mov ecx, buffer
int 0x80
据我所知,这将设置设置为适当的寄存器,然后“推送”它们执行。 我的问题是为什么eax会存储系统调用,而不是ebx? 为什么ecx会在屏幕上存储我们想要打印的内容? eax和ebx之间是否存在一些技术差异,或者这仅仅是命名约定?如果是,表“寄存器名称 - 功能”存储在哪里?
由于
答案 0 :(得分:4)
这是系统特定的事情,因此您必须阅读操作系统的手册。您描述的内容看起来像Linux系统调用。这些是well documented。软件中断本身没有关于寄存器的语义,但操作系统会告诉你它在各种寄存器和堆栈中所期望的数据以及它如何传达结果。
答案 1 :(得分:3)
以下是您的计划所做的事情:
; print a byte to stdout
mov eax, 4 ; the system interprets 4 as "write"
mov ebx, 1 ; standard output (print to terminal)
mov ecx, buffer ; pointer to the value being passed
mov edx, 1 ; size of the buffer
int 0x80 ; call the kernel
认为它是系统特定的......
就像下面的linux系统调用文档所述,sys_call编号存储在eax
中。
我建议你看一下这篇非常好的文件:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html
系统调用的数量将放在寄存器
eax
中。在调用软件中断int 0x80
之前,其他值将被放入其余寄存器中。在每个系统调用之后,在eax
中返回一个整数。
特别回答:
我的问题是为什么eax会存储系统调用,而不是ebx?
这是系统特定的。系统定义它应该是那样的,所以它是。
为什么ecx会在屏幕上存储我们想要打印的内容?
同样的事情......
eax和ebx之间是否存在一些技术差异,或者这仅仅是一种命名约定?