Hello, I don't know if this is possible but I would like to create a macro that can tell whether or not the argument is an immediate operand or not.
so for example
.data
value dd 5
.code
Tst MACRO arg:REQ
.IF arg=immediate ... ;obviously should be something different that does work
EXITM %1
.ELSE
EXITM %0
.ENDIF
ENDM
start:
mov eax,Tst(5) ;should put value of 1 in eax
mov eax,Tst(value) ;should put value of 0 in eax
end start
Is this impossible to achieve ? or isn't it ?
Thanks in advance
sure you can :
Quote
Tst MACRO arg:REQ
IF OPATTR(arg) EQ 24h
%echo arg is immediate operand
ELSE
%echo arg is not immediate operand
ENDIF
ENDM
Excerpt from MasmBasic.inc (there were differences between Masm and JWasm, but not sure if they still exist):
; OPATTR guide
; Bit Set If...
; 0 References a code label
; 1 Is a memory expression or has a relocatable data label
; 2 Is an immediate expression
; 3 Uses direct memory addressing, i.e. is an absolute memory reference
; 4 Is a register expression
; 5 References no undefined symbols and is without error
; 6 References a stack location (usually a LOCAL variable or parameter)
; 7 References an external label
; 8-10 Language type (0=no type)
; 76543210 ; use and 127 to mask external label and language bits
atMemory = 34 ; 00100010 ; [edx+20], [ebx+20], [eax+edx+20], JWasm: [eax+4*eax+20], [eax+20]
atImmediate = 36 ; 00100100
atLabel = 37 ; 10100101
atOffset = 38 ; 10100110 ; offset CrLf$ (immediate and mem expression)
atGlobal = 42 ; 10101010 ; CrLf$, Masm: [eax+4*eax+20], [eax+20]
atRegLabel = 43 ; 10101011 ; Masm: [eax+start] (Jwasm yields 37)
atRegister = 48 ; 00110000 ; also xmm
atXmm = 77 ; xxxxxxxx ; reg starting with x
atLocal = 98 ; 01100010 ; [esp+20], [ebp+20]
Thanks! Seems to be exactly what I needed :t
Well.. I just figured out that OPATTR(1.0) is 0. Is this supposed to be happening or is that just because floating point constants are not supported ?
Quote from: gelatine1 on October 23, 2015, 05:45:22 AMIs this supposed to be happening or is that just because floating point constants are not supported ?
yes, FP constants are not supported.
Some days ago, there was a similar question: http://masm32.com/board/index.php?topic=4709.0
Quote from: gelatine1 on October 23, 2015, 05:45:22 AM
Well.. I just figured out that OPATTR(1.0) is 0.
See qWord's answer. Don't rely on opattr(...) eq 0, sometimes the assembler throws an error instead, especially earlier ML versions.
Quote from: jj2007 on October 23, 2015, 06:45:30 AM
Quote from: gelatine1 on October 23, 2015, 05:45:22 AM
Well.. I just figured out that OPATTR(1.0) is 0.
See qWord's answer. Don't rely on opattr(...) eq 0, sometimes the assembler throws an error instead, especially earlier ML versions.
yep I had just tried that :p
Quote from: qWord on October 23, 2015, 06:15:38 AM
Quote from: gelatine1 on October 23, 2015, 05:45:22 AMIs this supposed to be happening or is that just because floating point constants are not supported ?
yes, FP constants are not supported.
Some days ago, there was a similar question: http://masm32.com/board/index.php?topic=4709.0
:icon_eek: :shock: Well...... Why didn't I see this topic before ??? :dazzled: Thanks alot anyway!! And I never actually realised that I could treat the 1.0 as a string too (or any other xxx.yyyyy number) :redface: