Hello everyone,
I admit to being pretty bad with masm64, but I'm trying. Anyway, the following silly program is throwing errors from ml.exe that I don't understand. Here it is:
Quoteinclude \masm32\include64\masm64rt.inc
printf PROTO :QWORD, VARARG
.data
frmt1 BYTE "%s",0
msg1 BYTE "rax is not 0",0
msg2 BYTE "rax is equal to 0",0
.code
main PROC
mov rax, 100
IF rax GT 0
invoke printf, ADDR frmt1, ADDR msg1
ELSE invoke printf, ADDR frmt1, ADDR msg2
ENDIF
ret
main ENDP
END
The IF statement causes this error: "error a2095: constant or relocatable label expected"
The ELSE statement causes this error: "error a2008:syntax error: invoke printf, addr frmt1, addr msg2"
I'm particularly puzzled by the reference to "relocatable label". Maybe "rax" is not relocatable, but what would be? How would I make one? But, I also don't see what's wrong with the invoke call.
BTW, perhaps this post belongs more on The Campus forum. If so, my apologies
Mark,
The notation IF ELSEIF ENDIF are not for dynamic code, they are conditions assembly directives. You can use the macros for .if .elseif .endif but note that the comparison operators are different. They work OK but are not altogether intuitive as 64 bit MASM does not allow some characters to be used. The reference is at the beginning of the file "vasily.inc" in the "macros64" directory.
comment * Comparison run-time operators
Operator Meaning
== Equal
{} Not equal
} Greater than
}= Greater than or equal to
{ Less than
{= Less than or equal to
& Bit test (format: expression & bitnumber)
~ Logical NOT
| Bit test
&& Logical AND
|| Logical OR
CARRY? Carry bit set
OVERFLOW? Overflow bit set
PARITY? Parity bit set
SIGN? Sign bit set
ZERO? Zero bit set
CARRY?|ZERO? ìåíüíå èëè ðàâíî
~(CARRY?|ZERO?) áîëüøå
äëÿ ñðàâíåíèÿ ÷èñåë ñî çíàêîì
~ZERO?&(SIGN?==OVERFLOW?) áîëüøå(greate than)
SIGN?==OVERFLOW? áîëüøå èëè ðàâíî(greate than or equal)
SIGN?{}OVERFLOW? ìåíüøå(less than)
ZERO?|(SIGN?{}OVERFLOW?) ìåíüøå èëè ðàâíî(less than or equal)
*
Hutch,
Thanks, that was very helpful. I changed IF/ELSE/ENDIF to .if/.else/.endif. It sort of worked, but the .else line kicked out a
warning from the assembler: "too many arguments in macro call". After looking at the corresponding macro in Vasily.inc I realized I could get rid of the warning by putting the invoke statement on its own line below the .else stateemt.
Did I put this thread on the wrong Forum?
Mark
> Did I put this thread on the wrong Forum?
Nah, this is fine.
"invoke" is a macro wrapper that calls the procedure call main macro. It should always be on its own line and not follow a label.