Как вы определяете перечисление в ассемблере 68000? - PullRequest
1 голос
/ 14 февраля 2020

Я использую ассемблер, который поставляется с компилятором Manx Azte c 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

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

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

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

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

        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 голос
/ 15 февраля 2020

Я думаю, вы захотите написать макрос, который вы можете использовать, например AUTONUMBER s_id STATUS_OKAY, который принимает два аргумента: 2nd - имя символа для определения, 1st - счетчик приращения.

You хотелось бы, чтобы он расширился до чего-то вроде:

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

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

...