我在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
但我希望能够插入和重新排列值,而不必手动重新编号。
我在想我也许能用宏做些什么,但我对它们没有太多经验。
3条答案
按热度按时间j7dteeu81#
我猜你会想写一个像
AUTONUMBER s_id STATUS_OKAY
这样的宏,它需要两个参数:2nd是要定义的符号名称,1st是要递增的计数器。你会希望它扩展为这样的内容:
(我不知道汇编程序或它定义宏的语法;但我认为这是可能的)。
一些汇编器有一个特殊的宏指令来重定义预处理器常量,允许您递增。例如,NASM不能使用
foo equ foo+1
,您需要%define
。你在大多数行中使用了s_id set s_id+1
,但在最后一行中使用了equ
,所以这可能只是一个拼写错误。完整的用法如下:
我把计数器名称放在前面,因为它每次都是相同的长度(而且很短)。把它放在第二位需要更多的缩进,以避免参差不齐的列。它把线的独特部分放在一端,在那里它在视觉上更明显。
b91juud32#
在Peter Cordes的建议之后,我提出了以下宏,它工作得很好:
vohkndzv3#
我想以前是这样的:
也可以有间隙或多个值,如:
如果你不需要间隔,并且想知道值的计数,你可以这样做: