Как вы определяете перечисление на языке ассемблера 68000?

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

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

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


person tim.smith    schedule 14.02.2020    source источник


Ответы (2)


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

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

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

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

person Peter Cordes    schedule 15.02.2020
comment
Спасибо! Я не совсем понял, как обращаться с макросом. - person tim.smith; 17.02.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
person tim.smith    schedule 19.02.2020