I want to have a list of named constants.
That list is final so any const that is not in that list will fail assembling.
So, how to define an Enum in UASM?
I tried using a struct but I read it is not the correct solution.
Hi dannycoh
There is no equivalent to an enum in assembly language, but there is a way to define constant values for the assembler using equates.
Most of the programmers use prefixes to group them together, such as:
;Constants for my procedure
MYPROC_SUCCESS equ 0
MYPROC_FAILED equ 1
MYPROC_DELAYED equ 2
...
See MASM manual chapter 8.5 here
https://www.plantation-productions.com/Webster/www.artofasm.com/DOS/pdf/ch08.pdf (https://www.plantation-productions.com/Webster/www.artofasm.com/DOS/pdf/ch08.pdf)
Biterider
enum MYPROC_SUCCESS, \
MYPROC_FAILED, \
MYPROC_DELAYED
or
enum MYPROC_SUCCESS, MYPROC_FAILED, MYPROC_DELAYED
or
enum MYPROC_SUCCESS=0, MYPROC_FAILED, MYPROC_DELAYED
enum MACRO __vargs:VARARG
local val__
val__=0
FOR __varg,<__vargs>
instr_ INSTR <__varg>,<=>
IF instr_
catstr_ SUBSTR <__varg>,instr_+1
val__ =catstr_
__varg
else
__varg EQU val__
ENDIF
val__ = val__ +1
ENDM
ENDM
Quote from: dannycoh on February 04, 2024, 05:33:29 PMSo, how to define an Enum in UASM?
include \masm32\MasmBasic\MasmBasic.inc
Init
; #common, start:member, member, member
Enum #MYPROC_, 100:SUCCESS, FAILURE, DONTKNOW
Print Str$("mps=%i\n", MYPROC_SUCCESS)
Print Str$("mpf=%i\n", MYPROC_FAILURE)
Print Str$("mpd=%i\n", MYPROC_DONTKNOW)
EndOfCode
Output:
mps=100
mpf=101
mpd=102
Works with Masm, UAsm, AsmC and JWasm.
Hi mabdelouahab,
Nice work :thumbsup: Here is a quick test :
include \masm32\include\masm32rt.inc
; enum macro by mabdelouahab
; https://masm32.com/board/index.php?msg=126825
enum MACRO __vargs:VARARG
LOCAL val__
val__=0
FOR __varg,<__vargs>
instr_ INSTR <__varg>,<=>
IF instr_
catstr_ SUBSTR <__varg>,instr_+1
val__ =catstr_
__varg
ELSE
__varg EQU val__
ENDIF
val__ = val__ +1
ENDM
ENDM
.data
format db 'test1 = %u',13,10
db 'sample = %u',13,10
db 'experiment = %u',0
.data?
buffer db 64 dup(?)
.code
start:
enum test1=2,sample,experiment
invoke wsprintf,ADDR buffer,\
ADDR format,test1,sample,\
experiment
invoke StdOut,ADDR buffer
invoke ExitProcess,0
END start