中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 求助大侠,如何实现! 上一主题 | 下一主题
upward
初级用户




积分 120
发帖 7
注册 2004-7-28
状态 离线
『楼 主』:  求助大侠,如何实现!

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

谢谢,小弟不甚感谢。

2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaojinpo
初级用户




积分 183
发帖 31
注册 2002-11-30
状态 离线
『第 2 楼』:  那你可以使用XMS 或 EMS

我做的程序就是使用EMS管理扩展内存的。



我的论坛  http://zjp-vlk.vicp.net/bbs 我在它就在!
2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
upward
初级用户




积分 120
发帖 7
注册 2004-7-28
状态 离线
『第 3 楼』:  

可是用XMS比较麻烦(倒来倒去的,效率也低)如果我用DJGPP编译的话,不知道对程序改动大不大啊

2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaojinpo
初级用户




积分 183
发帖 31
注册 2002-11-30
状态 离线
『第 4 楼』:  

改动不会太大,可以不小!可能主要问题会出现在显示驱动上。

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






我的论坛  http://zjp-vlk.vicp.net/bbs 我在它就在!
2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaojinpo
初级用户




积分 183
发帖 31
注册 2002-11-30
状态 离线
『第 5 楼』:  

如果太费事,你可以用EMS,她的效率比较高。



我的论坛  http://zjp-vlk.vicp.net/bbs 我在它就在!
2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
upward
初级用户




积分 120
发帖 7
注册 2004-7-28
状态 离线
『第 6 楼』:  

#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不怎么会用啊,您有源代码么?

2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
upward
初级用户




积分 120
发帖 7
注册 2004-7-28
状态 离线
『第 7 楼』:  

恩,我程序是直接操作显存

2004-8-2 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaojinpo
初级用户




积分 183
发帖 31
注册 2002-11-30
状态 离线
『第 8 楼』:  EMS 应用源代码!

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



我的论坛  http://zjp-vlk.vicp.net/bbs 我在它就在!
2004-8-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: