Board logo

标题: 请问DOS下怎样访问32位的地址空间?  [打印本页]

作者: superham     时间: 2002-12-17 00:00    标题: 请问DOS下怎样访问32位的地址空间? 

菜鸟我最近做一个PCI卡,上面有512K的RAM。
BIOS把它映射到Baseaddress为D8000000的空间(3G以上)
请问我怎样才能访问到这块内存啊(DOS下),大侠救命!
WatcomC, DJGPP这类的32位编译器可以做到吗,怎么做,谢谢!



[此贴子已经被作者于2002-12-17 17:43:42编辑过]



作者: 雨飞     时间: 2003-1-11 00:00
delphi for dos 下面可以用:mem[d8000000]来访问。
作者: szxxbb     时间: 2003-2-4 00:00
1:use watcom in 32bit
char *buf=(char*)0xd800000;
i=*buf

2:use dos
typedef struct
{               char gdt0[8];
                char gdt1[8];
                unsigned int srclimit;
                unsigned int srclw;
                unsigned char srclb;
                unsigned char srcrights;
                unsigned char srcflag;
                unsigned char srchb;
                unsigned int trglimit;
                unsigned int trglw;
                unsigned char trglb;
                unsigned char trgrights;
                unsigned char trgflag;
                unsigned char trghb;
                char bioscs[8];
                char biosss[8];
}gdt;
gdt For2_gdt;

int For2_read(unsigned long srcaddress,char far *bufer,unsigned int lenth)
{       unsigned int i,j;
        unsigned char cc,ccl,cch;
        char far *fp1;

        int15init();
        fp1=&bufer[0];
        i=FP_SEG(fp1);
        j=FP_OFF(fp1);
        _asm{
                mov ax,i
                mov dx,ax
                mov bx,j
                mov cl,04h
                shl dx,cl
                rol ax,cl
                and ax,0fh
                add bx,dx
                adc al,0
                mov i,bx
                mov cc,al
        }
        For2_gdt.trglimit=0xffff;
        For2_gdt.trglw=i;
        For2_gdt.trglb=cc;
        For2_gdt.trghb=0;
        For2_gdt.trgflag=0x4;
        For2_gdt.srclimit=0xffff;
        For2_gdt.srclw=(unsigned int)(srcaddress&0xffff);
        For2_gdt.srclb=(unsigned char)((srcaddress>>16)&0xff);
        For2_gdt.srchb=(unsigned char)((srcaddress>>24)&0xff);
        For2_gdt.srcflag=0x4;
        For2_gdt.srcrights=0x92;
        For2_gdt.trgrights=0x92;
        fp1=&(For2_gdt.gdt0[0]);
        i=FP_SEG(fp1);
        j=FP_OFF(fp1);
        _asm{
                mov ax,i
                mov es,ax
                mov si,j
                mov cx,lenth
                mov ah,87h
                int 15h
                mov i,ax
        }
        return i;
}
void int15init()
{       int i;

        for(i=0;i<8;i++)
        {   //  For2_gdt.bioscs=0;
            //  For2_gdt.biosss=0;
                For2_gdt.gdt0=0;
                For2_gdt.gdt1=0;
        }
        For2_gdt.bioscs[0]=0xff;
        For2_gdt.bioscs[1]=0xff;
        For2_gdt.bioscs[2]=0;
        For2_gdt.bioscs[3]=0;
        For2_gdt.bioscs[4]=0x0f;
        For2_gdt.bioscs[5]=0x9b;
        For2_gdt.bioscs[6]=0;
        For2_gdt.bioscs[7]=0;
        For2_gdt.biosss[0]=0xff;
        For2_gdt.biosss[1]=0xff;
        For2_gdt.biosss[2]=0;
        For2_gdt.biosss[3]=3;
        For2_gdt.biosss[4]=0;
        For2_gdt.biosss[5]=0x93;
        For2_gdt.biosss[6]=0;
        For2_gdt.biosss[7]=0;
}