The MASM Forum

64 bit assembler => UASM Assembler Development => Topic started by: dannycoh on February 04, 2024, 05:33:29 PM

Title: How to declare an enum?
Post by: dannycoh on February 04, 2024, 05:33:29 PM
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.
Title: Re: How to declare an enum?
Post by: Biterider on February 04, 2024, 05:49:03 PM
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
Title: Re: How to declare an enum?
Post by: mabdelouahab on February 04, 2024, 06:03:03 PM
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 
Title: Re: How to declare an enum?
Post by: jj2007 on February 04, 2024, 08:45:51 PM
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.
Title: Re: How to declare an enum?
Post by: Vortex on February 04, 2024, 08:49:12 PM
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