Mail Archives: djgpp/1997/11/16/22:23:05
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
- Raw text -