中国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 楼』:  

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




我的论坛 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 ={0};
unsigned char pdescr_tmp ={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,(3*8-1)
db 0x66
xor ax, ax
mov ax, offset GDT_Table
db 0x66
add ax, cx
mov word ptr pdescr_tmp , ax
db 0x66
shr ax, 16
mov word ptr pdescr_tmp , 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 // =MOV AL, FS:
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 ,al //=MOV FS: ,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(" "<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
for(j=0; j&lt;16; j++)
{
if(ReadByte(Address+i*16+j) &lt; 0x20)
printf(" . "<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
else
printf(" %C ", ReadByte(Address+i*16+j));
}
printf("\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
}
}int main()
{
unsigned long Address=0;
unsigned long tmp;

LoadFSLimit4G();
printf("====Designed By Southern. 1995.7.17====\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
printf (" Now you can Access The Machine All 4G Memory.\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
printf (" Input the Start Memory Physical to DUMP. \n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
printf (" Press D to Cuntinue DUMP, 0 to End &amp; Quit, \n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;

do
{
printf("-"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
scanf("%IX", &amp;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
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

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


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



论坛跳转: