We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you two Citrix podcasts. Learn about 2020 trends and get answers to your biggest Citrix questions!Listen Now

x

Another Assembly Question

Doug8
Doug8 asked
on
Medium Priority
563 Views
Last Modified: 2008-03-17
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
Comment
Watch Question

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.

Author

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.

Commented:
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)?



Author

Commented:
Adjusted points to 70
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.

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.