68000汇编语言中如何定义枚举?
How do you define an enumeration in 68000 assembly language?
我在 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
但我希望能够插入和重新排列值而无需手动重新编号。
我想我也许可以用宏做点什么,但我对它们没有太多经验。
我猜你想写一个你可以像 AUTONUMBER s_id STATUS_OKAY
这样使用的宏,它有两个参数:第二个是要定义的符号名称,第一个是要递增的计数器。
您希望它扩展为类似以下内容:
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
我把计数器名称放在第一位,因为它每次的长度都相同(而且很短)。将它放在第二位需要更多缩进以避免列参差不齐。并将线条的独特部分放在一端,视觉上更明显。
根据 Peter Cordes 的建议,我想出了以下宏,效果很好:
macro ENUM
set
set +1
endm
s_id set 0
ENUM s_id,STATUS_OKAY
ENUM s_id,STATUS_WAITING
ENUM s_id,STATUS_ERROR
我在 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
但我希望能够插入和重新排列值而无需手动重新编号。
我想我也许可以用宏做点什么,但我对它们没有太多经验。
我猜你想写一个你可以像 AUTONUMBER s_id STATUS_OKAY
这样使用的宏,它有两个参数:第二个是要定义的符号名称,第一个是要递增的计数器。
您希望它扩展为类似以下内容:
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
我把计数器名称放在第一位,因为它每次的长度都相同(而且很短)。将它放在第二位需要更多缩进以避免列参差不齐。并将线条的独特部分放在一端,视觉上更明显。
根据 Peter Cordes 的建议,我想出了以下宏,效果很好:
macro ENUM
set
set +1
endm
s_id set 0
ENUM s_id,STATUS_OKAY
ENUM s_id,STATUS_WAITING
ENUM s_id,STATUS_ERROR