这个是第五章内核雏形的开始部分,讲得是汇编和C的混合编程,具体的例子如下
汇编:
extern choose ;int choose (int a, int b);
[section data] ;表明以下是数据段,可有可无
param1 dd 8
param2 dd 5 ;因为在32位模式下,故参数都是4字节的
[section text] ;表明以下是代码段
global _start ;表明程序入口
global myprintf ;在汇编中声明以便可以被C程序调用
_start:
push dword [param2] ;调用C程序中的choose函数之前,先
push dowrd [param1] ;把要传递的参数入栈。参数入栈顺序,先调用后入栈
call choose
add esp , 8
;系统调用,sys_exit
mov ebx ,0
mov eax,1
int 0x80
;void myprintf(char *msg ,int length);
myprintf:
mov edx, [esp+8] ;参数length
mov ecx ,[esp+4] ;参数msg
;系统调用,sys_write
mov ebx , 1
mov eax ,4
int 0x80h
ret
C程序:
void myprintf(char *msg ,int len);
int choose(int a , int b)
{
if(a>b)
myprintf("param2 is great!\n",17); 共有17个字符
else
myprintf("param1 is great!\n",17); 共有17个字符
return 0;
}
总结:汇编与C语言的混合编程,如果要相互调用和传递参数,
1、在汇编中要使用extern来声明C中的函数,同时要用global表明要被C所调用的汇编程序
2、在C程序中,则按照函数原型声明汇编语言中的函数。当然前提是你要能够将汇编的函数有C语言的函数形式表是出来