2015-04-27 3 views
0

Я пишу программу на ассемблере, используя TASM 4.1, и я наткнулся на проблему, которую я не смог исправить в течение 2 дней. Проблема заключается в том, что TASM просто не распознает метки в макросе как локальные метки и даст мне ошибку при сборке (символ уже определен в другом месте). До сих пор я попытался следующие вещи:TASM; LOCAL и LOCALS директивы

  1. Ввод LOCALS в самом начале .asm файла и используя @@ для локальных меток (как это было предложено в одном из ответов на аналогичной проблемы). Произведен нулевой эффект вообще.
  2. Использование LOCAL внутри макроса для отображения всех моих локальных меток, начинающихся с @@ (опять же, как было предложено в Интернете). Однако при сборке возникли еще больше ошибок: «Символ уже другого вида» и «Ожидающий тип указателя»
  3. Ввод LOCALS @@ в начале макроса. Как и в первом случае, нулевой эффект.
  4. Ввод локалей в начале файла .asm и включение меток с использованием LOCAL. Тот же эффект, что и в случае с # 2.
  5. Ввод локалей в начале файла .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 

Update:

Хорошо, я, кажется, нашел решение. То, что сработало для меня было объявить ЭТИКЕТКИ в начале .asm файла и с помощью LOCAL в самом макросе для каждой метки, как это:

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

перечислив их в одной строке (LOCAL @@ label1, @@ label2, @ @ label3, ...) не работает.

Возможно, кому-то это окажется полезным.

ответ

1

Я не уверен, как ваше решение решило проблему, но директива LOCALS разрешает префикс @@, а префикс @@ только делает метки локальными для текущей процедуры (PROC). Только директива LOCAL может создавать метки локально для макросов и только в том случае, если они используются в начале определения макроса. Решение № 2 должно было сработать для вас, но, возможно, ваше использование префикса @@ в контексте директивы LOCAL в запущенном макросом TASM. Однако я не могу воспроизвести эту проблему с более ранней версией ассемблера 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