Another Assembly Question

I am trying to learn to use assembly and am trying to make a fuction to
draw a pixel to unsigned char far *double buffer using an external
assembly function. and i cant get it to work right. This is what i have
so far and it gives me 2 errors.

; AsmPixel(int x, int y, int value)

Parms struc
         dw    2 dup(?)
x        dw    ?
y        dw    ?
value    dw    ?
Parms ends

    .model   small
    .386
    .code
    public _AsmPixel

extrn _double_buffer:word
ES:DI -> double_buffer

_AsmPixel    proc    near
      push   bp
      mov    dx, 320   ; Put 320 in DX
      mul    dx        ; multiply AX (Y) by DX (320)
      add    ax, bx    ; add BX (X) to AX -> 320*y+x
      add    di, ax    ; add to pointer offset ***
                   
;ES:DI now points at &double_buffer[320*y+x]
     
      mov    es:[di], cl ; Store the byte
_AsmPixel      endp
Doug8Asked:
Who is Participating?
 
LucHoltkampConnect With a Mentor Commented:
I thought ES:DI->double_buffer was not part of you asm file but just a remark (I thougt you forgot the ';' ). It sure isn't assembly. If you want to load a adress into a segment:offset registerpair you should use one of the le.. instructions (lea lds les) these instructions load the segment register with the correct segment and then loads the offset in a register.
For example:
les di, _double_buffer
loads the es segmentregister with the segment of _double_buffer and the di register with the offset.
Finally: you use registers to pass variables to your function, this is ok internally but you can't call your function from C or an other language. If you want to interface with an prog.language like C I recommend that you write the function in C and then compile it to assembly (most compiler have an option for this)
Use the assembly the compiler generates as a starter. I always use this methode. It's fast and bugfree.
0
 
LucHoltkampCommented:
What are the errors??
Are you sure ES:DI contains the adress of the buffer? shouldn't you load the adres with lea ?
A good trick is: write it in C and compile to assembly, and use it as a starter.
.luc.
0
 
Doug8Author Commented:
The errors are end of file found and symbol already different kind on the line of ES:DI-> double_buffer. And i dont know if it contains the address of double_buffer and i dont know the statement lea. Thanx for the suggestion.
0
 
rmichelsCommented:
Don't you need  "end" at the end of file.  That should fix the eof error.    It's been awhile for me in ASM but don't you need

mov byte ptr es:[di],cl  (byte ptr added)?



0
 
Doug8Author Commented:
Adjusted points to 70
0
All Courses

From novice to tech pro — start learning today.