TASM; LOCAL和LOCALS指令

时间:2015-04-27 12:39:24

标签: assembly macros label local tasm

我正在使用TASM 4.1编写一个关于汇编程序的程序,我偶然发现了一个我无法修复2天的问题。 问题是TASM只是不会将宏中的标签识别为本地标签,并且在组装时会给我一个错误(符号已在其他地方定义)。到目前为止,我已尝试过以下内容:

  1. 将LOCALS放在.asm文件的最开头,并使用@@作为本地标签(正如在类似问题的答案之一中所建议的那样)。产生零效果。
  2. 在宏中使用LOCAL列出以@@开头的所有本地标签(再次,如网上建议的那样)。然而,这在组装时产生了更多的错误:"符号已经不同类型"和"期望指针类型"
  3. 在宏的开头放置LOCALS @@。就像第一种情况一样,零效果。
  4. 将LOCALS放在.asm文件的开头并使用LOCAL列出标签。与#2相同的效果。
  5. 将LOCALS放在.asm文件的开头并使用LOCALS @@ inside macro。没效果。
  6. 将LOCALS @@放在.asm文件的开头。没效果。
  7. 这是我第一次尝试编程,所以如果我错过了导致这个问题的一些微不足道的事情,我会道歉。这是我不止一次使用的宏:

    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,...)不起作用。

    也许有人会觉得这很有用。

1 个答案:

答案 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