2015-04-27 32 views
0

我正在使用TASM 4.1编写一个汇编程序,我偶然发现了一个我无法修复2天的问题。 问题是TASM不会将宏中的标签识别为本地标签,并且在组装时会给我一个错误(Symbol已经在别处定义过)。到目前为止,我曾尝试以下的事情:TASM; LOCAL和LOCALS指令

  1. 把LOCALS在.ASM文件的开始,并使用@@本地标签(如在回答类似的问题的一个建议)。无论如何产生零效应。
  2. 在宏内部使用LOCAL列出以@@开头的所有本地标签(同样,正如Web上所建议的那样)。然而,这样在组装时产生了更多的错误:“符号已经不同类型”和“期望指针类型”
  3. 将LOCALS @@放在宏的开始处。就像第一种情况一样,零效应。
  4. 将LOCAL放在.asm文件的开头,并使用LOCAL列出标签。与#2效果相同。
  5. 将LOCAL放在.asm文件的开头,并在宏中使用LOCALS @@。没有效果。
  6. 将LOCALS @@放在.asm文件的开头。没有效果。

这是我第一次尝试编程,所以我很抱歉如果我错过了一些导致此问题的微不足道的事情。下面是我使用不止一次的烦恼宏:

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的文件的开头声明标签,在宏本身LOCAL每个标签是这样的:

LOCAL @@label1 
LOCAL @@label2 
LOCAL @@label3 
... 

清单他们一行(LOCAL @@ LABEL1,LABEL2 @@,@ @ label3,...)不起作用。

也许有人会觉得这有用。

回答

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