我是一个djgpp的初级学习者,所有的介绍都突出它一次可以访问4G的空间,我觉得它的语法和c差不多,可是我以前在c下编程时分配内存是通过数组或是指针的,那么在djgpp里,应该怎么样来访问这么大的地址空间呢?
我看出错后,dj报告有段地址和偏移量,这些东西是怎么设置的呢?
请高手指点!谢谢
应该用sys/farptr.h中的_far*系列函数来访问内存。以下函数原型来自djgpp v2.0x的libc帮助文档。
#include
unsigned char _farpeekb(unsigned short selector, unsigned long offset);
unsigned short _farpeekw(unsigned short selector, unsigned long offset);
unsigned long _farpeekl(unsigned short selector, unsigned long offset);
void _farpokeb(unsigned short sel, unsigned long off, unsigned char val);
void _farpokew(unsigned short sel, unsigned long off, unsigned short val);
void _farpokel(unsigned short sel, unsigned long off, unsigned long val);
void _farsetsel(unsigned short selector);
unsigned short _fargetsel(void);
void _farnspokeb(unsigned long offset, unsigned char value);
void _farnspokew(unsigned long offset, unsigned short value);
void _farnspokel(unsigned long offset, unsigned long value);
unsigned char _farnspeekb(unsigned long offset);
unsigned short _farnspeekw(unsigned long offset);
unsigned long _farnspeekl(unsigned long offset);
假定你要访问的内存地址为:
unsigned long ulAddr = 0x0000a000;
用_farpokeb(_dos_ds, ulAddr, byte)来写一个byte,用_farpeekb()来读一个byte。_dos_ds是系统预定义值,直接用就行了。
如果要连续访问内存地址区间, 则可以:
unsigned int i, wLen = 0x1000;
_farsetsel(_dos_ds);
for (i = 0; i < wLen; i++) {
printf("0x%02hX\t", _farnpeekb(ulAddr + i);
}
ps: 建议认真阅读djgpp faq,如果这样的问题你问在djpp的邮件列表里,他们只会回答你faq 10.2或者18.x。
这些部分在faq中的解释还算比较清楚吧?那我试试看用一些小例子来说明djgpp下和borland c/watcom c下的不同?可以包括外部中断部分,如何?不过拜托不要催我进度,工作上的活儿也很多。<img src="images/smilies/face-raspberry.png" align="absmiddle" border="0">
我的email是atlas_wang@hotmail.com。