Board logo

标题: 求助大侠,如何实现! [打印本页]

作者: upward     时间: 2004-8-2 00:00    标题: 求助大侠,如何实现!

我程序是在BC3.1下编译通过的,但是随着软件升级,发现内存已经不够使用了。我想咨询一下,如果不改变其运行环境(MSDOS),不改变源程序或者做少量改动的情况下,用什么方式比较好,(自己写让dos切换倒保护模式?可惜不怎么会啊)
如果上述方案不太可行,那么用什么方式可以?

谢谢,小弟不甚感谢。
作者: zhaojinpo     时间: 2004-8-2 00:00    标题: 那你可以使用XMS 或 EMS

我做的程序就是使用EMS管理扩展内存的。
作者: upward     时间: 2004-8-2 00:00
可是用XMS比较麻烦(倒来倒去的,效率也低)如果我用DJGPP编译的话,不知道对程序改动大不大啊
作者: zhaojinpo     时间: 2004-8-2 00:00
改动不会太大,可以不小!可能主要问题会出现在显示驱动上。

[此贴子已经被作者于2004-8-2 16:45:51编辑过]



作者: zhaojinpo     时间: 2004-8-2 00:00
如果太费事,你可以用EMS,她的效率比较高。
作者: upward     时间: 2004-8-2 00:00
#include <dos.h>
#include <stdio.h>unsigned long GDT_Table[]= {  0,0,          //NULL - 00H
      0x0000FFFF,0x00CF9A00,
      0x0000FFFF,0x00CF9200};
unsigned char OldIDT [6]={0};
unsigned char pdescr_tmp [6]={0};#define KeyWait() {while(inportb(0x64) &2);}void A20Enable(void)
{
  KeyWait();
  outportb(0x64,0xD1);
  KeyWait();
  outportb(0x60,0xDF);
  KeyWait();
  outportb(0x64,0xFF);
  KeyWait();
} void LoadFSLimit4G(void)
{
  A20Enable();
  asm
  {
    cli           // Disable inerrupts
    sidt OldIDT   // Save OLD IDTR
    lidt pdescr_tmp    // Set up empty IDT. Disable any interrupts
  }
  asm
  {
db 0x66
mov cx, ds
db 0x66
shl cx, 4
mov word ptr pdescr_tmp[0],(3*8-1)
db 0x66
xor ax, ax
mov ax, offset GDT_Table
db 0x66
add ax, cx
mov word ptr pdescr_tmp [2], ax
db 0x66
shr ax, 16
mov word ptr pdescr_tmp [4], ax
lgdt pdescr_tmp
  }
  asm
  {
mov dx, 0x10      // The Data32 Selector
db 0x66, 0x0f, 0x20, 0xc0      // mov eax, cr0
db 0x66
mov bx, ax
or ax, 1
db 0x66, 0x0f, 0x22, 0xc0
jmp flush
  }         // Clear machine perform cache.
flush:      // Now In Flat Mode, But The CS is Real Mode Value.
  asm
  {
db 0x66
mov ax, bx
db 0x8e, 0xe2      // mov fs, dx
db 0x66, 0x0f, 0x22, 0xc0      // mov cr0, eax
    lidt OldIDT
    sti
  }
}

unsigned char ReadByte (unsigned long Address)
{
asm db 0x66
asm mov di,word ptr Address // MOV EDI, Address
asm db 0x67 //32 bit Address Prefix
asm db 0x64 //FS:
asm mov al,byte ptr [BX] // =MOV AL, FS: [EDI]
return _AL;
}
unsigned char WriteByte(unsigned Long Address)
{
asm db 0x66
asm mov di,word ptr Address //MOV EDI, Address
asm db 0x67 //32 bit Address Prefix
asm db 0x64 //FS:
asm mov byte ptr [BX],al //=MOV FS: [EDI],AL
return _AL;
}
//////// Don t Touch Above Code ///
void Dump4G(unsigned long Address)
{
  int i;
  int j;
  
  for(i=0; i<20; i++)
  {
    printf("%081X: ", (Address+i*16));
    for(j=0; j<16; j++)
      printf("% 02X", ReadByte(Address+i*16+j));
    printf(" ";
    for(j=0; j<16; j++)
    {
      if(ReadByte(Address+i*16+j) < 0x20)
        printf(" . ";
      else
        printf(" %C ", ReadByte(Address+i*16+j));
    }
    printf("\n";
  }
}int main()
{
  unsigned long Address=0;
  unsigned long tmp;
  
  LoadFSLimit4G();
  printf("====Designed By Southern. 1995.7.17====\n";
  printf (" Now you can Access The Machine All 4G Memory.\n";
  printf (" Input the Start Memory Physical to DUMP. \n";
  printf (" Press D to Cuntinue DUMP, 0 to End & Quit, \n";
  
  do
  {
    printf("-";
    scanf("%IX", &tmp);
    if(tmp==0x0d)
      Address+=(20*16);
    else
      Address=tmp;
    Dump4G(Address);
  }while(Address != 0);
  return 0;
}这段程序是说直接将内存空间扩大倒4G,可是我怎么编译通不过呢?编译器对汇编的编译需要什么配置啊EMS不怎么会用啊,您有源代码么?
作者: upward     时间: 2004-8-2 00:00
恩,我程序是直接操作显存
作者: zhaojinpo     时间: 2004-8-6 00:00    标题: EMS 应用源代码!

如何使用我已经详细的写在我的论坛上了!