本帖最后由 -兔子- 于 2013-1-19 11:25 编辑
例子:
向扩展内存加载文件, 比如中文国标字库等。。。
/**************************************************************************
向扩展内存[可寻址4GB]写入数值子程序(long)
void save_Emem_L( ulong Address, long n )
代入变量:
Address 内存地址: 0x00000000 - 0xFFFFFFFF
n 数值
返回变量: 无.
程序返回值: 无.
注: 使用FS.
**************************************************************************/
void save_Emem_L( ulong Address, long n )
{
_asm{
MOV EBX,Address;
MOV EAX,n;
MOV FS:WORD PTR [EBX],EAX;
}
}
/**************************************************************************
向扩展内存[寻址4GB]指定地址快速加载文件
long load_Emem_FILE( ulong Address, uchar *file_name )
代入变量:
Address 内存地址: 0x0000,0000 - 0xFFFF,FFFF
*file_name 文件名.
返回变量: 无.
程序返回值: = +nnnn 装入文件长度 / =-1 打开文件失败.
注: 使用FS.
**************************************************************************/
long load_Emem_FILE( ulong Address, uchar *file_name )
{
int handle,i;
ulong addr,lnn,nn,rnn;
FILE *infile_FILE;
union {
long nn[128];
char cc[512];
} file_buf;
lnn = 0;
// 取文件句柄.
if ( ( handle = open( file_name, O_BINARY | O_RDONLY ) ) == -1 )
{
// 文件打开失败!
return( -1 );
}
else
{
// 取文件长度.
lnn = filelength( handle );
close( handle );
}
// 打开文件.
if ( ( infile_FILE = fopen( file_name,"rb" ) ) == NULL )
{
// 文件打开失败!
return( -1 );
}
addr = Address;
nn = 0;
read_file_st:
// lnn = 文件长度. nn = 0 -> lnn = 当前文件指针.
if ( ( lnn - nn ) > 512 ) rnn = 512; else rnn = lnn - nn;
if ( rnn == 0 ) goto read_file_end;
// rnn = 读取字节数.
fread( file_buf.cc , sizeof(char) , (uint)(rnn), infile_FILE );
if ( rnn == 512 )
{
// 每次读取512B. [=128*4B]
for( i=0; i<=127; i++ )
{
// 每次写入4B, 写128次. [=512B]
save_Emem_L( addr, file_buf.nn );
addr += 4;
}
}
else
{
// 读取剩余字节:
for( i=0; i<rnn; i++ )
{
save_Emem_C( addr, file_buf.cc );
addr++;
}
}
// 判结尾.
nn = nn + rnn;
if ( nn < lnn ) goto read_file_st;
// 文件结束
read_file_end:
fclose( infile_FILE );
return( lnn );
}
|