Я использую ассемблер, который поставляется с компилятором Manx Aztec C (версия 5.0) на Commodore 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

Но я хотел бы иметь возможность вставлять и переставлять значения без необходимости перенумерации вручную.

Я думал, что смогу что-то сделать с макросами, но у меня мало опыта с ними.

1
tim.smith 14 Фев 2020 в 19:44

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

Сначала я ставлю имя счетчика, потому что оно всегда одинаково (и коротко). Второе место потребовало большего отступа, чтобы избежать неровных столбцов. И это помещает уникальную часть линии в один конец, где это визуально более очевидно.

1
Peter Cordes 15 Фев 2020 в 07:13

После предложения Питера Кордеса я придумал следующий макрос, который прекрасно работает:

        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
1
tim.smith 19 Фев 2020 в 01:09