普通函数的调用(或是内核进程的普通函数调用),参数的传递是通过压入栈的方式实现;
汇编指令CALL之后,会入栈下一条指令的地址eip,要是要传递参数或是保护一些关键的上下文信息,需要顺序入栈相应的寄存器的值;
再使用ebp来从栈中取出要用的参数,或是用pop来出栈参数
系统调用int 0x80是去系统的中断向量表找到第0x80h位置,然后根据eax的值来确定是第几号系统调用功能,这里的参数是通过寄存器来传递的;
为什么这里用寄存器传递而不用堆栈呢?因为系统调用过程是一个进程在用户态使用int80进入内核态,这个过程有进程堆栈到进程内核堆栈的切换,没办法跨堆栈传递;
这里回顾下CALL和INT的区别:
CALL汇编调用:
1.要将下一条指令的EIP压入栈(若是段间还要将CS也入栈)
2.需要手写对上下文的保护,并未有硬件自动的保护
INT中断过程:
1.通过TR指向的TSS找到调用中断的进程内核栈的位置
2.硬件自动的上下文入栈(eax,ebx…)保护,压入进程内核栈
3.执行中断子程序