News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

invoke parameters

Started by Jimg, March 25, 2005, 06:35:23 PM

Previous topic - Next topic

Jimg

If I have the following code, where the parameter I want is defined below where I need to use it-


  ; these three don't work

invoke GetDlgItem,hParent,IdVal ; doesn't work

invoke GetDlgItem,hParent,[IdVal] ; doesn't work

invoke GetDlgItem,hParent,dword ptr IdVal  ; doesn't work

  ; however this one does

mov eax,IdVal
invoke GetDlgItem,hParent,eax ; works

.
.
.
.data?
IdVal dd ?
.code
mov IdVal,1017


Clearly masm knows what and where IdVal is or the "mov eax, IdVal" wouldn't work.
What is the form of putting the address of the variable in as an invoke parameter without out using a register or moving the definition above the code?

similarly, if an address were to be passed to routine XXXX

invoke XXXX,hParent,addr IdVal ; doesn't work
invoke XXXX,hParent,offset IdVal ; doesn't work

mov eax,offset IdVal
invoke XXXX,hParent,eax ; works


QvasiModo

The first form is correct, I don't know why it's not working for you...
invoke GetDlgItem,hParent,IdVal
Same thing for passing offsets. Just remember that OFFSET won't work with local variables.

Jimg

I'm glad it's supposed to work!

Here's the error I get:

Assembling: F:\WinAsm\Progs\NewTest\DgTest.asm
F:\WinAsm\Progs\NewTest\DgTest.asm(281) : error A2006: undefined symbol : IdVal
F:\WinAsm\Progs\NewTest\DgTest.asm(281) : error A2114: INVOKE argument type mismatch : argument : 2


QvasiModo

You need to define the IdVal symbol before using it... try placing your data before your code.

MichaelW

Although forward references to variables are generally supported, they are not for invoke.
eschew obfuscation

Jimg

I was reallllllly hoping it was something I was doing wrong.  How about the the replacements for invoke that are floating around.  Do any of them allow forward references like (except invoke) everything else in masm does?

hutch--

Jim,

The only thing you are doing "wrong" is placing your data AFTER the code so that it has not yet been referenc3d by the assembler. Old TASM and others used to work like that but MASM has always required the data to be available before it is referenced.

Just place your data BEFORE the code that references it.
Download site for MASM32      New MASM Forum
https://masm32.com          https://masm32.com/board/index.php

Jimg

That's the thing that bugs me.  No other instruction requires the data before it is referenced, Invoke is the only one.

Mark Jones

 Hi Jim, you can always stick the declaration inline:


.data
  IdVal DD 0
; align 4?
.code
  invoke GetDlgItem,hParent,IdVal


I'm surprised MASM didn't complain that the var was "undefined."

It could always be worse... be thankful you're not programming JAL - http://groups.yahoo.com/group/jallist/ - entire routines cannot be forward-referenced!  ::)  :lol
"To deny our impulses... foolish; to revel in them, chaos." MCJ 2003.08