之前看了linux 0.11的系统调用返回机制,利用iret去改变eip,从内核空间代码转移到用户空间代码上运行,然后我就想试一试利用ret来调用C函数。由于不想另外再写一个汇编文件,我就选择了C嵌汇编的用法。
首先我们来看一看在C里面,函数调用和函数返回是怎么实现的。我们可以写一个简单的程序编译然后反汇编来看看,函数调用和返回的指令还有堆栈的数据(堆栈在函数返回中起着重要的作用)。我们来写个简单的程序:
intfun(int a)
{
a = 1;
}
voidmain()
{
int b = 1;
fun(b);
}
经过反汇编之后得出的汇编:
080483b4<fun>:
80483b4: 55 push %ebp
80483b5: 89e5 mov %esp,%ebp
80483b7: c745 08 01 00 00 00 movl $0x1,0x8(%ebp)
80483be: 5d