汇编EXTERN用法

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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值