x86汇编Linux中如何解释系统调用

3

我对在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以打印某些内容时,实际上发生了什么?


请注意,汇编语法因汇编器而异。对于微软(和可能是英特尔)汇编器,| mov ecx,msg | 将加载 msg 中的前4个字节到 ecx 中。要获取地址,使用 | mov ecx,offset msg | 与这些汇编器一起使用。方括号 [] 仅用于寄存器间接操作数,例如 | mov ecx,[ebx] |。 - rcgldr
2个回答

3

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


2

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


1
系统调用分派表确实被称为sys_call_table,而存储在eax寄存器中的系统调用号(“_一个唯一的整数(即从1到256左右的整数)_”)被用作索引,如此处所示:https://github.com/torvalds/linux/blob/v3.18/arch/x86/kernel/entry_32.S#L427 - xmojmr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接