我正在使用TASM 4.1编写一个关于汇编程序的程序,我偶然发现了一个我无法修复2天的问题。 问题是TASM只是不会将宏中的标签识别为本地标签,并且在组装时会给我一个错误(符号已在其他地方定义)。到目前为止,我已尝试过以下内容:
这是我第一次尝试编程,所以如果我错过了导致这个问题的一些微不足道的事情,我会道歉。这是我不止一次使用的宏:
dot_connect_oct1 macro dot1_x, dot1_y, dot2_x, dot2_y, colour
;;code
@@check_1:
;;code
jz @@exit_1
;;code
jg @@draw_1_2
@@draw_1_1:
;;code
jmp @@check_1
@@draw_1_2:
;;code
jmp @@check_1
@@exit_1:
endm
更新
好吧,我似乎找到了解决方案。对我有用的是在.asm文件的开头声明LABELS,并在宏本身中为每个标签使用LOCAL,如下所示:
LOCAL @@label1
LOCAL @@label2
LOCAL @@label3
...
将它们列在一行(LOCAL @@ label1,@@ label2,@@ label3,...)不起作用。
也许有人会觉得这很有用。
答案 0 :(得分:1)
我不确定您的解决方案是如何解决问题的,但LOCALS指令仅启用@@前缀,而@@前缀仅在当前过程(PROC)中生成标签。只有LOCAL指令才能使标签位于宏的本地,并且只有在宏定义的开头使用。解决方案编号2应该对您有用,但也许您在宏的混淆TASM中使用LOCAL指令上下文中的@@前缀。但是,我无法使用早期版本的汇编程序TASM 3.1重现此问题。
所以你应该做的是声明没有@@前缀的本地宏标签,因为它不是必需的,而且实际上做的不是你期望的。像这样:
dot_connect_oct1 macro dot1_x, dot1_y, dot2_x, dot2_y, colour
LOCAL check_1, draw_1_1, draw_1_2, exit_1
check_1:
jz exit_1
...
endm