我正在使用Commodore Amiga 500上Manx Aztec C编译器(5.0版(附带的汇编程序。
我想编写等效于以下 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
但我希望能够插入和重新排列值,而无需手动重新编号。
我在想我也许可以用宏做点什么,但我对它们没有太多经验。
我猜你会想写一个可以使用的宏,就像AUTONUMBER s_id STATUS_OKAY
一样需要两个参数:2nd 是要定义的符号名称,1st 是要递增的计数器。
您希望它扩展到以下内容:
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
我把计数器名称放在第一位,因为它每次的长度都相同(而且很短(。 将其放在第二位需要更多的缩进以避免参差不齐的列。 它把线条的独特部分放在一端,在视觉上更明显。
在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_ERROR
我认为它在过去是这样做的:
rsreset
Enum0: rs.b 1
Enum1: rs.b 1
Enum2: rs.b 1
您还可以有间隙或多个值,例如:
rsreset
rs.b 1 ; skip 0
Enum1: rs.b 1
Enum2: rs.b 1
rs.b 10 ; skip 10 values
Enum13: rs.b 1
Enum14: rs.b 0 ; no increase
Also14: rs.b 1
Enum15: rs.b 1
如果您没有间隙并且想知道您可以执行的值计数:
rsreset
Enum0: rs.b 1
Enum1: rs.b 1
Enum2: rs.b 1
MyEnum_Count: rs.b 0