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

时间:2015-01-02 01:08:04

标签: linux assembly x86 nasm

我对在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中进行打印时会发生什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

Linux内核将所有系统调用例程维护为函数指针数组(可以称为sys_call表),并且eax中的值为内核提供该数组的索引(要选择哪个系统调用)。其他寄存器如ebx,ecx,edx包含该系统调用例程的相应参数。 int 80h用于从用户模式到内核模式的cpu软件中断,因为实际的系统调用例程是内核空间函数。