📄 main.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 + -