x86 程序集中如何解释系统调用 linux

How are system calls interpreted in x86 assembly linux

我对 why/how 在 Linux 环境中在 x86 程序集中打印的值感到困惑。

例如,如果我想打印一个值,我会这样做:

mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx msgLength
int 80h

现在我明白数值4会在中断后对sys_write进行系统调用。但我的问题是,4的意义是什么?是把十进制值4的地址加载到eax中吗?还是将值 4 加载到 eax 寄存器?

看完后我很困惑我可以使用以下指令将地址处的值传输到寄存器:

mov eax, [msg]

eax 现在将包含地址为 msg 的字节,但我猜这种格式是不可接受的:

mov eax, [4]

那么当我将 4 移动到 eax 中打印一些东西时到底发生了什么?

只是将值(数字)4 加载到 eax,那里没有魔法。操作系统会查看 eax 中的值来确定您想要的功能。系统调用号是标识您可以使用的各种可用内核函数的代码。

Linux 内核将所有系统调用例程维护为函数指针数组(可以称为 sys_call table)并且 eax 中的值给出了该函数的索引数组(选择哪个系统调用)由内核。其他寄存器如 ebx、ecx、edx 包含该系统调用例程的适当参数。 而 int 80h 用于从用户模式到内核模式 cpu 的软件中断,因为实际的系统调用例程是内核 space 函数。