From: Shawn Hargreaves Newsgroups: comp.os.msdos.djgpp Subject: Re: HELP! INT21 - 3D problem!!!! Date: Sat, 8 Mar 1997 14:44:02 +0000 Organization: None Distribution: world Message-ID: References: <01bc2b7c$ce3fad70$7229cfa9 AT p590> NNTP-Posting-Host: talula.demon.co.uk MIME-Version: 1.0 Lines: 36 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Paul Hooper writes: >I really look forward to hearing from someone about this. I feel like I am >missing.something really obvious. You are :-) But unfortunately the solution isn't so easy... >char *filename = "ZZZ"; >int main(int argc, char *argv[]) >{ >asm ("movb $0x00,%al\n\t" > "movb $0x3d,%ah\n\t" > "movl _filename,%edx\n\t" > "int $0x21\n\t"); > > return 0; >} That would be fine in real mode, but this is protected mode. Your pointer to the filename is a virtual address, relative to the data segment of your program, but DOS works with real mode segmented pointers that can only access the first megabyte of memory. Some extenders will automatically transfer such data from one address space to the other, but for it to work reliably you need to do the conversion yourself. Use dosmemput() to transfer your filename string to the transfer buffer (__tb, look in the djgpp FAQ for more info), and then use __dpmi_int() to call the DOS routine. Or you could save yourself several years of effort and use functions from libc, eg. fopen(), that handle all this stuff for you :-) /* * Shawn Hargreaves - shawn AT talula DOT demon DOT co DOT uk - http://www.talula.demon.co.uk/ * Beauty is a French phonetic corruption of a short cloth neck ornament. */