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

📄 c8253.cpp

📁 windows下汇编语言 学习汇编语言好助手
💻 CPP
字号:
// C8253.cpp : Defines the entry point for the console application.
//
/*********************************\
 *文件:C8253.CPP                *
 *功能:演示直接写IO             *
\*********************************/
#include "stdafx.h"
#include <windows.h>

WORD Count;

int main(int argc, char* argv[])
{
	Count = 0x1800;
	
	__asm jmp Begin

	__asm
	{
Change8253:
	mov     al,0x36
	out     0x43,al
	mov     ax,Count
	out     0x40,al
	mov     al,ah
	out     0x40,al
	retf
	}

	__asm
	{
ToRing0Code:
	push ebp
	mov  ebp,esp
	sub  esp,8
	call	GetLdtAddress	//取出LDT的地址,返回结果在eax中
	mov		ecx,[eax]		//保存LDT第一个描述符
	mov		[ebp-4],ecx
	mov		ecx,[eax+4]
	mov		[ebp-8],ecx
	mov		edx,[ebp+8]		//把调用门的内容写入LDT
	mov		[eax],dx				//偏移量的低16位
	mov		word ptr [eax+2],28h	//段选择子
	mov		word ptr [eax+4],0ec00h	//属性
	shr		edx,16			//偏移量的高16位
	mov		[eax+6],dx
	push	eax
//	CALL32	7,0				//调用 Ring0 子程序
	_emit 0x9a
	_emit 0
	_emit 0
	_emit 0
	_emit 0
	_emit 7
	_emit 0
	pop		ebx
	mov		edx,[ebp-4]		//恢复LDT第一个描述符
	mov		[ebx],edx
	mov		edx,[ebp-8]
	mov		[ebx+4],edx
	leave
	ret 4
GetLdtAddress:
	push	ebx				//先要取GDT的地址
	sgdt	[esp-2]
	pop		ebx
	sldt	ax				//取LDT内容
	and		eax,0fff8H		//	屏蔽掉低3位、eax的高16位清0
	add		ebx,eax			//算出LDT描述符的位置
	mov		eax,[ebx+2]		//从描述符中取出LDT的地址
	mov		dl,[ebx+7]
	shl		edx,24
	and		eax,0ffffffh
	or		eax,edx
	ret
	}

	__asm
	{
Begin:
	pushad
	push offset Change8253
	call ToRing0Code
	popad
	}
	return 0;
}


⌨️ 快捷键说明

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