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

How do you define an enumeration in 68000 assembly language?

我在 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 这样使用的宏,它有两个参数:第二个是要定义的符号名称,第一个是要递增的计数器。

您希望它扩展为类似以下内容:

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
      set     
      set     +1
        endm

s_id    set     0
        ENUM    s_id,STATUS_OKAY
        ENUM    s_id,STATUS_WAITING
        ENUM    s_id,STATUS_ERROR