我使用的汇编程序与Manx Aztec C编译器(5.0版)上的商品Amiga 500。
我想编写与以下C代码相当的代码:
enum STATUS {
STATUS_OKAY,
STATUS_WAITING,
STATUS_ERROR
};我试过以下几种方法--这是可行的--但它似乎有点无足轻重:
s_id set 0
STATUS_OKAY equ s_id
s_id set s_id+1
STATUS_WAITING equ s_id
s_id equ s_id+1
STATUS_ERROR equ s_id我知道我能做到:
STATUS_OKAY equ 0
STATUS_WAITING equ 1
STATUS_ERROR equ 2但是,我希望能够插入和重新排列值,而不必手动重新编号。
我在想,我也许可以用宏做些什么,但我对它们没有太多的经验。
发布于 2020-02-15 07:13:32
我猜您会想要编写一个宏,可以像AUTONUMBER s_id STATUS_OKAY那样使用,它需要两个args:第二个是要定义的符号名,第一个是用于增量的计数器。
你会希望它扩展到这样的东西:
STATUS_OKAY equ s_id
s_id set s_id+1 # post-incr so it uses the initial value of s_id(我不知道用于定义宏的汇编程序或它的语法;我认为这是可能的。)
有些汇编程序有一个特殊的宏指令,用于重新定义预处理常量,允许您增加。NASM不适用于foo equ foo+1,你需要%define。您在大部分行中使用了s_id set s_id+1,但在最后一行中使用了equ,所以这可能只是一个错误。
因此,完全使用如下所示:
s_id set 0 # starting value
AUTONUMBER s_id STATUS_OKAY
AUTONUMBER s_id STATUS_WAITING
AUTONUMBER s_id STATUS_ERROR我把计数器名放在第一位,因为每次都是相同的长度(而且很短)。把它放在第二,需要更多的缩进,以避免衣衫褴褛的列。它把这条线的独特部分放在一端,在那里它在视觉上更明显。
发布于 2020-02-19 01:03:49
在Peter Cordes的建议之后,我提出了以下宏,这个宏非常有用:
macro ENUM
\2 set \1
\1 set \1+1
endm
s_id set 0
ENUM s_id,STATUS_OKAY
ENUM s_id,STATUS_WAITING
ENUM s_id,STATUS_ERRORhttps://stackoverflow.com/questions/60230399
复制相似问题