我正在阅读 Linux 中的 nasm 编程手册,但有一件事我找不到答案。
考虑以下代码:
mov eax, 4
mov ebx, 1
mov ecx, buffer
int 0x80
据我了解,这会将设置设置为适当的寄存器,然后“推动”它们执行。我的问题是为什么 eax 会存储系统调用,而不是 ebx?为什么 ecx 存储我们想要在屏幕上打印的东西?eax 和 ebx 之间是否存在一些技术差异,或者这只是一个命名约定?如果是,表“寄存器名称-函数”存储在哪里?
谢谢
这是系统特定的事情,因此您必须阅读操作系统的手册。你描述的看起来像一个Linux系统调用。这些都是有据可查的。软件中断本身对寄存器没有语义,但操作系统会告诉您它期望在各种寄存器和堆栈中的数据以及它如何传达结果。
这是您的程序执行的操作:
; 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 之间是否存在一些技术差异,或者这只是一个命名约定?