![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 14:42 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 求助大侠,如何实现! |
| 可打印版本 1,295 / 7 |
| 第1楼 upward | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 7 积分 120 | |
|
求助大侠,如何实现! 我程序是在BC3.1下编译通过的,但是随着软件升级,发现内存已经不够使用了。我想咨询一下,如果不改变其运行环境(MSDOS),不改变源程序或者做少量改动的情况下,用什么方式比较好,(自己写让dos切换倒保护模式?可惜不怎么会啊)
如果上述方案不太可行,那么用什么方式可以? 谢谢,小弟不甚感谢。 |
|
| 第2楼 zhaojinpo | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 31 积分 183 | |
|
那你可以使用XMS 或 EMS 我做的程序就是使用EMS管理扩展内存的。
|
|
| 第3楼 upward | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 7 积分 120 | |
|
可是用XMS比较麻烦(倒来倒去的,效率也低)如果我用DJGPP编译的话,不知道对程序改动大不大啊
|
|
| 第4楼 zhaojinpo | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 31 积分 183 | |
|
改动不会太大,可以不小!可能主要问题会出现在显示驱动上。
|
|
| 第5楼 zhaojinpo | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 31 积分 183 | |
|
如果太费事,你可以用EMS,她的效率比较高。
|
|
| 第6楼 upward | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 7 积分 120 | |
|
#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(" " ;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不怎么会用啊,您有源代码么? |
|
| 第7楼 upward | 发表于 2004-08-02 00:00 |
| 初级用户 发帖 7 积分 120 | |
|
恩,我程序是直接操作显存
|
|
| 第8楼 zhaojinpo | 发表于 2004-08-06 00:00 |
| 初级用户 发帖 31 积分 183 | |
|
EMS 应用源代码! 如何使用我已经详细的写在我的论坛上了!
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |