1

我在 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

但我希望能够插入和重新排列值而无需手动重新编号。

我在想我也许可以用宏做一些事情,但我对它们没有太多经验。

4

2 回答 2

1

我猜你想写一个你可以使用的宏,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

我把计数器名称放在第一位,因为它每次的长度都相同(而且很短)。将它放在第二位需要更多缩进以避免参差不齐的列。它将线条的独特部分放在一端,在视觉上更明显。

于 2020-02-15T07:13:32.687 回答
1

根据 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
于 2020-02-19T01:03:49.990 回答