我对在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中进行打印时会发生什么?
答案 0 :(得分:2)
只需将值(数字)4加载到eax
,就没有魔法了。操作系统将查看eax
中的值以确定您想要的功能。系统调用号是一个代码,用于标识可以使用的各种可用内核函数。
答案 1 :(得分:1)
Linux内核将所有系统调用例程维护为函数指针数组(可以称为sys_call表),并且eax中的值为内核提供该数组的索引(要选择哪个系统调用)。其他寄存器如ebx,ecx,edx包含该系统调用例程的相应参数。 int 80h用于从用户模式到内核模式的cpu软件中断,因为实际的系统调用例程是内核空间函数。