Date: Sun, 16 Nov 1997 19:21:41 -0800 (PST) Message-Id: <199711170321.TAA02300@adit.ap.net> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" To: "Risto J. Sutinen" , "'djgpp AT delorie DOT com'" From: Nate Eldredge Subject: Re: Could someone help me with Nasm module linking? Precedence: bulk At 05:35 11/16/1997 +-200, Risto J. Sutinen wrote: >I have tryed to compile and link following source files using Nasm and DJGPP. >So far I have got only error messages. What the heck is wrong?? Someone help me >out please! >[EXTERN _color] >[GLOBAL _Fillscrn(int color)] ^^^^^^^^^^^ Unless this is a new extension to NASM that I haven't heard about, parameter passing can't work automatically. Also, the EXTERN makes it think `color' will be a global variable, not an argument. You'll have to just declare `Fillscrn' as a normal GLOBAL and then get its arguments by their stack offset. I believe the first argument is 8 bytes up on the stack (above the return address and the pushed ebp). >[SECTION .text] > >;prototype: Fillscrn(int color); > > >_Fillscrn: > push ebp > mov ebp, esp > > mov ax, 0A000h > mov es, ax This looks like 16-bit code. You can't access conventional memory just by loading its segment part into a segment register. You'll need to load the `_dos_ds' selector into es for this to work (this could be tricky since `_dos_ds' is a macro alias for a struct field), then use the video memory's linear address and use the 32-bit form of movs. Here's a quick example (not tested): ; Load es with _dos_ds somehow mov edi,0A0000h ; note 4 trailing 0's! mov ecx,320*200/2 ; use ecx instead rep stosw > rep rep stosw What is two `rep's supposed to mean? I think you only want one. Also, if you use `stosd' instead, it will do 32-bit stores and work twice as fast. You'll have to use a little cleverness to fill eax with bytes of `color' (hint: use another register and `rol eax,16')... >extern void Fillscrn(int color); Declare this as `extern "C"' to avoid confusions from the C++ compiler's name mangling. > >void main(void) `main' should always return `int'. > void Fillscrn(t); The `void' is not valid syntax; I think the compiler will think it's a declaration. `Fillscrn(t);' is sufficient. HTH Nate Eldredge eldredge AT ap DOT net