⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apmjump.s

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 S
字号:
/* * Far call, absolute indirect. * The argument is the offset. * We use a global structure for the jump params, * so this is *not* reentrant or thread safe. */#include "mem.h"#define SSOVERRIDE	BYTE $0x36#define CSOVERRIDE	BYTE $0x2E#define RETF		BYTE $0xCBGLOBL	apmjumpstruct+0(SB), $8TEXT fortytwo(SB), $0	MOVL	$42, AX	RETFTEXT getcs(SB), $0	PUSHL	CS	POPL	AX	RETTEXT apmfarcall(SB), $0	/*	 * We call push and pop ourselves.	 * As soon as we do the first push or pop,	 * we can't use FP anymore.	 */	MOVL	off+4(FP), BX	MOVL	seg+0(FP), CX	MOVL	BX, apmjumpstruct+0(SB)	MOVL	CX, apmjumpstruct+4(SB)	/* load necessary registers from Ureg */	MOVL	ureg+8(FP), DI	MOVL	28(DI), AX	MOVL	16(DI), BX	MOVL	24(DI), CX	MOVL	20(DI), DX	/* save registers, segments */	PUSHL	DS	PUSHL	ES	PUSHL	FS	PUSHL	GS	PUSHL	BP	PUSHL	DI	/*	 * paranoia: zero the segments, since it's the	 * BIOS's responsibility to initialize them.	 * (trick picked up from Linux driver).	PUSHL	DX	XORL	DX, DX	PUSHL	DX	POPL	DS	PUSHL	DX	POPL	ES	PUSHL	DX	POPL	FS	PUSHL	DX	POPL	GS	POPL	DX	 */	PUSHL	$APMDSEG	POPL	DS	/*	 * The actual call.	 */	CSOVERRIDE; BYTE $0xFF; BYTE $0x1D	LONG $apmjumpstruct+0(SB)	/* restore segments, registers */	POPL	DI	POPL	BP	POPL	GS	POPL	FS	POPL	ES	POPL	DS	PUSHFL	POPL	64(DI)	/* store interesting registers back in Ureg */	MOVL	AX, 28(DI)	MOVL	BX, 16(DI)	MOVL	CX, 24(DI)	MOVL	DX, 20(DI)	MOVL	SI, 4(DI)	PUSHFL	POPL	AX	ANDL	$1, AX	/* carry flag */	RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -