我们讲解这节的主要目的是在以后的操作系统开发过程中会用到这些内容。
比如:从系统引导过程中的汇编程序跳转到系统主函数中,或者在中断处理的汇编代码中跳转到中断处理函数(传说中的中断上部), 这些过程都是从汇编程序跳转到C程序的,其中不可缺少的有:调用约定,参数传递方式,函数调用方式等。话不多说,下面让我们逐一介绍。
函数的调用方式
函数的调用方式其实没那么复杂,基本上就是jmp、call、ret或者他们的变种而已。让我们先看下面的程序。
int test()
{
int i = 0;
i = 1 + 2;
return i;
}
int main()
{
test();
return 0;
}
这段程序基本上没有什么难点,很简单,对吧?唯一要注意的地方是main函数的返回值,这里个人建议大家要使用int类型作为主函数的返回值,而不要使用void,或者其他类型。虽然,在我们看来,主函数执行到return 0之后就跟我们没有什么关系了。但是,有的编译器要求主函数要有个返回值,或者,在某些场合里,系统环境会用到主函数的返回值。考虑到上述原因,要使用int类型作为主函数的返回值,如果处于某个特殊的或者可预测的环境下,那就无所谓了。
说了这么多,我们反汇编一下这段代码,看看汇编语言是怎么调用test函数的。工具objdump,用于反汇编二进制程序,它有很多参数,可以反汇编出我们想要的信息。
objdump工具命令:
objdump -d test