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 函数。
我对 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 函数。