nbsp; if ( 0xFFFF == limit )
if ( BASE_DESIRED == base ) {
// BASE_DESIRED为内存段对应的基地址
wSelector = sel;
break; }}}
直接访问物理内存的实现
得到了段选择符之后,即可把该段选择符置于相应的段寄存器中( 不能用CS,DS),
用该寄存器进行数据访问。需注意的是,任何非法段选择符写入段寄存器将会导
致通用保护错误(General Protection Faul t)。
下面的代码实现物理内存的读/写操作(段选择符用上述方法得到):
void WriteMemory(WORD sel, DWORD dwOffset, const char * str, UINT length)
{
char cWrite;
for ( UINT i = 0; i < length; i ++ )
{
cWrite = str [i];
_asm { push es mov ax, sel mov es, ax
mov ebx, dwOffset mov al, cWrite mov byte ptr es:[ebx], al
inc dwOffset pop es
}
}
}
void ReadMemory ( WORD sel, DWORD dwOffset,char * str, UINT length )
{
char cRead;
for ( UINT i = 0; i < length; i ++ ) {
_asm {
push es
mov ax, sel
mov es, ax
mov ebx, dwOffset
mov al, byte ptres:[ebx]
mov cRead, al
inc dwOffset
pop es
}
str [i] = cRead;
}
}
本文所用操作系统为中文Windows 95 OSR 2.0以及中文Windows
98,编程环境为Vis ual C++ 5.0。