如何在 68000 汇编语言中定义枚举?



我正在使用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

最新更新