发新帖我要提问
12
返回列表
打印

X86底层软件の彻底裸奔

[复制链接]
楼主: -兔子-
手机看帖
扫描二维码
随时随地手机跟帖
21
-兔子-|  楼主 | 2013-1-19 11:17 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 -兔子- 于 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 );
}


使用特权

评论回复
22
-兔子-|  楼主 | 2013-1-19 11:19 | 只看该作者
本帖最后由 -兔子- 于 2013-1-19 11:24 编辑

在实模式下, 不依赖任何操作系统提供的调用, 不占用任何资源, 简单寻址最大4G内存操作, 介绍完毕, 还能有效率更高的吗???:lol

使用特权

评论回复
23
mcu818| | 2013-1-24 12:15 | 只看该作者
看完兔子大哥的解说,果然强悍,可惜我的X86水平只到186就没再继续学了,也只停留在实模式1MB内,只知道CS SS DS ES四个段寄存器,不知FS为何物,更没有EAX,EBX..等32位寄存器

不过对工控来说,代码在1MB以内就够用了,不足的如字库和文件,用分页方式实现,不过前提是硬件要自己作的,如果要买现成的X86工控板,还是要用兔子大哥的方法最好

--------------------------------------

再问一下兔子大哥,实模式C的前提下,宝兰的终极版本是那一个最好? 我手边有3.1的,还有更好更稳定的吗?

使用特权

评论回复
24
charrijon| | 2013-1-26 22:41 | 只看该作者
前段时间从8086开始一直学到了486,发现x86还是挺好用的,只可惜x86目前在工控领域用量越来越少,遗憾。

使用特权

评论回复
25
梦爱琴所| | 2013-3-4 21:23 | 只看该作者
这贴荒了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则