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

fhity93d  于 2023-06-06  发布在  其他
关注(0)|答案(3)|浏览(155)

我在Commodore Amiga 500上使用Manx阿兹特克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

但我希望能够插入和重新排列值,而不必手动重新编号。
我在想我也许能用宏做些什么,但我对它们没有太多经验。

j7dteeu8

j7dteeu81#

我猜你会想写一个像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

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

b91juud3

b91juud32#

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

vohkndzv3#

我想以前是这样的:

rsreset
Enum0: rs.b 1
Enum1: rs.b 1
Enum2: rs.b 1

也可以有间隙或多个值,如:

rsreset
    rs.b 1 ; skip 0
Enum1: rs.b 1
Enum2: rs.b 1
    rs.b 10 ; skip 10 values
Enum13: rs.b 1
Enum14: rs.b 0 ; no increase
Also14: rs.b 1
Enum15: rs.b 1

如果你不需要间隔,并且想知道值的计数,你可以这样做:

rsreset
Enum0: rs.b 1
Enum1: rs.b 1
Enum2: rs.b 1
MyEnum_Count: rs.b 0

相关问题