C语言写的函数和汇编写的函数之间可以相互调用,分别编译成机器码后由链接器将其链接成可执行程序。根据“《30天自制操作系统》”中的描述可以概况成如下的形式。
1. C语言可调用的汇编函数
1.1 在汇编程序中定义函数
声明函数的属性为 GLOBAL
GLOBAL _函数名
在汇编里函数名 _函数名
_函数名:
... ;汇编语句,可以调用[ESP+4]的值
RET
1.2 C语言程序中调用汇编函数
开头声明函数
void 函数名(int *;int *;...);
使用函数名调用汇编函数
注意函数前面并没有 "_"
1.3 汇编函数可以带参数,参数会存放在
第一个数字的存放地址:[ESP+4]
第二个数字的存放地址:[ESP+8]
...未说明个数限制
1.4 例子
汇编函数naskfunc.nas内部分代码
...
GLOBAL _io_out8, _io_out16, _io_out32
...
_io_out8: ; void io_out8(int port, int data);
MOV EDX,[ESP+4] ; port
MOV AL,[ESP+8] ; data
OUT DX,AL
RET
C语言调用时的部分代码
...
void io_out8(int port, int data);
...
io_out8(0x03c8, start);
2. C语言写的其他C语言程序可调用的函数
2.1 写好函数内容
C语言外部函数是一种可在自身所处的源文件及其他源文件中都能被调用的函数.外部函数的作用域是整个项目.
extern int fun(int a, int b);
定义函数时忽略extern和static,则默认为extern函数.
static
内部函数,限定在本源码文件中使用,不能被其他代码文件调用.
2.2 在头文件件中加入该函数的声明
2.3 在需要调用的源码前面加上头文件名(#include"***.h")
库文件使用#include<***.h>
自定义头文件使用#include"***.h"
2.4 程序中直接使用函数名进行调用
3. 汇编语言程序可调用的C语言函数
3.1 在写好C语言函数内容
函数属性为extern(默认情况)
例如:
void inthandler21(int *esp)
{
...
}
3.2 在需要调用的汇编程序前面加上说明
使用EXTERN声明函数的内容在其他程序里,“EXTERN _函数名,_函数名”
例如:
EXTERN _inthandler21, _inthandler27, _inthandler2c
3.3 汇编程序中调用方式
在汇编程序中使用“CALL _函数名”的形式调用
实例:
_asm_inthandler21:
...
CALL _inthandler21
...
知乎&微信公众号:告别小白