EXTERN在汇编中用来引用一个在其他模块中定义过的符号名,使得这个符号名所表示的数据或函数能在该模块中被使用。
[FILE "naskfunc.nas"]
GLOBAL _asm_inthandler21
EXTERN _inthandler21
[SECTION .text]
_asm_inthandler21:
PUSH ES
PUSH DS
PUSHAD
MOV EAX,ESP
PUSH EAX
MOV AX,SS
MOV DS,AX
MOV ES,AX
CALL _inthandler21
POP EAX
POPAD
POP DS
POP ES
IRETD
void inthandler21(int *esp)
{
struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;
boxfill8(binfo->vram, binfo->scrnx, COL8_000000, 0, 0, 32 * 8 - 1, 15);
putfonts8_asc(binfo->vram, binfo->scrnx, 0, 0, COL8_FFFFFF, "INT 21 (IRQ-1) : PS/2 keyboard");
for (;;) {
io_hlt();
}
}
inthandler21函数在bootpack.h中声明过,这里在汇编文件naskfunc.nask中要用到这个函数,故用EXTERN语句。这里我们有几个疑问一块来探讨一下:
*上面的CALL _inthandler21是怎样一个调用?
先将当前的IP压入栈中,再跳到_inthandler21处执行指令。
*但一般是跳到某个汇编段,而这里是一个C源文件中的函数,这有是什么原理?
首先,汇编程序可以调用C函数,这是混合编程。而且还可以引用C文件中定义的变量,如 C: char ch; ASM: EXTERN ch:byte。
在我们的这个例子中,函数inthandler21带有参数,如何在汇编中传参。方法是汇编程序将参数值压入堆栈
MOV EAX,ESP
PUSH EAX