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

📄 main.bak

📁 演示如何在DOS OS下访问4GB内存空间
💻 BAK
字号:
#include <stdio.h>
#include <conio.h>

//function declarations
void OpenA20(); //Open A20 address line
void Set4GB( );
void two_mem(unsigned long addrd, unsigned long addrs, unsigned long leng,
			 unsigned char yuzi);

void OpenA20()
{
  while(inp(0x64) & 2); outp(0x64,0xd1);
  while(inp(0x64) & 2); outp(0x60,0xdf);
  while(inp(0x64) & 2); outp(0x64,0xff);
}

unsigned long GDT_def[ ]={0,0,0x0000FFFF,0x008F9200}; //GDT
unsigned char GDT_Addr[6]={0}; //The length and address of GDT

void Set4GB( )
{
  asm{
	 cli
	 mov word ptr GDT_Addr[0], (2*8-1) //The length of GDT

	 mov eax, ds
	 shl eax, 4 //ds*16
	 xor ebx, ebx
	 mov ebx, offset GDT_def
	 add eax,ebx
	 mov dword ptr GDT_Addr[2], eax
	 lgdt fword ptr GDT_Addr

	 mov ebx, 8
	 mov eax, cr0
	 or  al,1
	 mov cr0,eax //PE = 1
	 jmp flush1 //Enter protected-mode
	 }
flush1:
  asm{
	 mov fs,bx //FS.Selector = 8
	 mov gs,bx //GS.Selector = 8
	 and al,0xfe
	 mov cr0,eax //PE = 0
	 jmp flush2 //Enter real-mode
	 }
flush2:
  asm{
	 mov ax, 0
	 mov fs,ax //设置FS描述符的基地址为0
	 mov gs,ax //设置GS描述符的基地址为0
	 sti //开中断
	 }
}

void two_mem(unsigned long addrd, unsigned long addrs, unsigned long leng,
			 unsigned char yuzi)
{
  asm mov ecx, leng //leng为图象数据块的字节数
  asm mov esi, addrs //addrs为源图象数据块的32位线性基地址
  asm mov edi, addrd //addrd为二值化图象数据块的32位线性基地址
  asm mov ah, yuzi //yuzi为阈值
TN0:
  asm cmp fs:[esi], ah //源图象数据与阈值进行比较
  asm mov al, 0 //如果源图象数据<阈值,al=0
  asm jc TN1
  asm mov al, 255 //如果源图象数据≥阈值,al=255
TN1:
  asm db 0x66
  asm mov fs:[di], al //存运算结果到二值化数据块中
  asm db 0x66
  asm inc si //源图象数据块的32位线性地址增一
  asm db 0x66
  asm inc di //二值化图象数据块的32位线性地址增一
  asm loop TN0
}

void main( )
{
  printf("\nS:打开A20地址线...");
  OpenA20( );
  printf("\nE:打开A20地址线...");
  printf("\nS:设置4GB内存访问...");
  Set4GB( );
  printf("\nE:设置4GB内存访问...");
  long int v;
  asm mov esi,0x200000
  asm mov eax,fs:[esi]
  asm mov v,eax
  printf("%#lx\n",v);
}

⌨️ 快捷键说明

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