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

📄 i386trap.s

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 S
📖 第 1 页 / 共 2 页
字号:
	jmp	printnextframe
nomoreframes:
	ret

/************************************************************************/
/* AL = Char to display                                                 */
/************************************************************************/
i386PrintChar:
	.code32

	pushl	i386_ScreenPosY
	pushl	i386_ScreenPosX
	pushl	$SCREEN_ATTR
	andl	$0xff,%eax
	pushl	%eax
	call	_MachVideoPutChar
	addl	$16,%esp

	ret

/************************************************************************/
/* ESI = Address of text to display                                     */
/************************************************************************/
i386PrintText:
	.code32

i386PrintTextLoop:
	lodsb

	// Check for end of string char
	cmp	$0,%al
	je	i386PrintTextDone

	// Check for newline char
	cmp	$0x0a,%al
	jne	i386PrintTextLoop2
	incl	i386_ScreenPosY
	movl	$0,i386_ScreenPosX
	jmp	i386PrintTextLoop

i386PrintTextLoop2:
	call	i386PrintChar
	incl	i386_ScreenPosX

	jmp	i386PrintTextLoop

i386PrintTextDone:
	
	ret

/************************************************************************/
/* Prints the value in EAX on the screen in hex                         */
/************************************************************************/
i386PrintHexDword:
	.code32

	call	i386PrintHex1

i386PrintHex1:
	call	i386PrintHex2
i386PrintHex2:
	call	i386PrintHex3
i386PrintHex3:
	movb	$4,%cl
	rol		%cl,%eax
	push	%eax
	andb	$0x0f,%al
	movl	$i386PrintHexTable,%ebx
	xlat	/*$i386PrintHexTable*/
	call	i386PrintChar
	incl	i386_ScreenPosX
	pop		%eax

	ret

i386PrintHexTable:
	.ascii	"0123456789ABCDEF"

/************************************************************************/
/* Prints the value in AX on the screen in hex                         */
/************************************************************************/
i386PrintHexWord:
	.code32

	call	i386PrintHexWord1
i386PrintHexWord1:
	call	i386PrintHexWord2
i386PrintHexWord2:
	movb	$4,%cl
	rol		%cl,%ax
	push	%eax
	andb	$0x0f,%al
	movl	$i386PrintHexTable,%ebx
	xlat	/*$i386PrintHexTable*/
	call	i386PrintChar
	incl	i386_ScreenPosX
	pop	%eax

	ret

/************************************************************************/
/* Prints the value in AL on the screen in hex                         */
/************************************************************************/
i386PrintHexByte:
	.code32

	call	i386PrintHexByte1
i386PrintHexByte1:
	movb	$4,%cl
	rol		%cl,%al
	push	%eax
	andb	$0x0f,%al
	movl	$i386PrintHexTable,%ebx
	xlat	/*$i386PrintHexTable*/
	call	i386PrintChar
	incl	i386_ScreenPosX
	pop		%eax

	ret

/************************************************************************/
EXTERN(i386DivideByZero)
	.code32

	movl	$i386DivideByZeroText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386DebugException)
	.code32

	movl	$i386DebugExceptionText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386NMIException)
	.code32

	movl	$i386NMIExceptionText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386Breakpoint)
	.code32

	movl	$i386BreakpointText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386Overflow)
	.code32

	movl	$i386OverflowText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386BoundException)
	.code32

	movl	$i386BoundExceptionText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386InvalidOpcode)
	.code32

	movl	$i386InvalidOpcodeText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386FPUNotAvailable)
	.code32

	movl	$i386FPUNotAvailableText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386DoubleFault)
	.code32

	popl	%eax
	movl	%eax,i386_ERROR_CODE

	movl	$i386DoubleFaultText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386CoprocessorSegment)
	.code32

	movl	$i386CoprocessorSegmentText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386InvalidTSS)
	.code32

	popl	%eax
	movl	%eax,i386_ERROR_CODE

	movl	$i386InvalidTSSText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386SegmentNotPresent)
	.code32

	popl	%eax
	movl	%eax,i386_ERROR_CODE

	movl	$i386SegmentNotPresentText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386StackException)
	.code32

	popl	%eax
	movl	%eax,i386_ERROR_CODE

	movl	$i386StackExceptionText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386GeneralProtectionFault)
	.code32

	popl	%eax
	movl	%eax,i386_ERROR_CODE

	movl	$i386GeneralProtectionFaultText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386PageFault)
	.code32

	popl	%eax
	movl	%eax,i386_ERROR_CODE

	movl	$i386PageFaultText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386CoprocessorError)
	.code32

	movl	$i386CoprocessorErrorText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386AlignmentCheck)
	.code32

	movl	$i386AlignmentCheckText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************/
EXTERN(i386MachineCheck)
	.code32

	movl	$i386MachineCheckText,i386ExceptionDescriptionText
	jmp		i386CommonExceptionHandler

/************************************************************************
 * DEBUGGING SUPPORT FUNCTIONS
 ************************************************************************/
EXTERN(_INSTRUCTION_BREAKPOINT1)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr0
	movl	%dr7,%eax
	andl	$0xfff0ffff,%eax
	orl		$0x00000303,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_MEMORY_READWRITE_BREAKPOINT1)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr0
	movl	%dr7,%eax
	andl	$0xfff0ffff,%eax
	orl		$0x00030303,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_MEMORY_WRITE_BREAKPOINT1)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr0
	movl	%dr7,%eax
	andl	$0xfff0ffff,%eax
	orl		$0x00010303,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_INSTRUCTION_BREAKPOINT2)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr1
	movl	%dr7,%eax
	andl	$0xff0fffff,%eax
	orl		$0x0000030c,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_MEMORY_READWRITE_BREAKPOINT2)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr1
	movl	%dr7,%eax
	andl	$0xff0fffff,%eax
	orl		$0x0030030c,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_MEMORY_WRITE_BREAKPOINT2)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr1
	movl	%dr7,%eax
	andl	$0xff0fffff,%eax
	orl		$0x0010030c,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_INSTRUCTION_BREAKPOINT3)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr2
	movl	%dr7,%eax
	andl	$0xf0ffffff,%eax
	orl		$0x00000330,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_MEMORY_READWRITE_BREAKPOINT3)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr2
	movl	%dr7,%eax
	andl	$0xf0ffffff,%eax
	orl		$0x03000330,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_MEMORY_WRITE_BREAKPOINT3)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr2
	movl	%dr7,%eax
	andl	$0xf0ffffff,%eax
	orl		$0x01000330,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_INSTRUCTION_BREAKPOINT4)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr3
	movl	%dr7,%eax
	andl	$0x0fffffff,%eax
	orl		$0x000003c0,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_MEMORY_READWRITE_BREAKPOINT4)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr3
	movl	%dr7,%eax
	andl	$0x0fffffff,%eax
	orl		$0x300003c0,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

EXTERN(_MEMORY_WRITE_BREAKPOINT4)
	.code32

	pushl	%eax

	movl	8(%esp),%eax

	movl	%eax,%dr3
	movl	%dr7,%eax
	andl	$0x0fffffff,%eax
	orl		$0x100003c0,%eax
	movl	%eax,%dr7

	popl	%eax

	ret

⌨️ 快捷键说明

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