Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: "Локальные" метки в подпрограмме
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Grigorij
Здравствуйте.

В процессе изучения ассемблера и написания программы для PIC16 возник вопрос - возможно ли создать локальную метку внутри подпрограммы?

Если рассматривать макросы, то такая конструкция:

Код
NAME_OF_MACRO MACRO1

    LOCAL _finally

         ;какие-либо действия
          goto _finally
         ;какие-либо действия

    _finally:
      
         ;какие-либо действия

ENDM

NAME_OF_MACRO MACRO2

    LOCAL _finally

         ;какие-либо действия
          goto _finally
         ;какие-либо действия

    _finally:
      
         ;какие-либо действия

ENDM


вполне работоспособна и хорошо читаема. Однако если имеется 2 подпрограммы, то такой код:

Код
NAME_OF_PROC1:

         ;какие-либо действия
          goto _finally
         ;какие-либо действия

    _finally:
      
         ;какие-либо действия

RETURN

NAME_OF_PROC2:

         ;какие-либо действия
          goto _finally
         ;какие-либо действия

    _finally:
      
         ;какие-либо действия

RETURN


является ошибочным.

Конечно можно к имени метки добавлять еще и название подпрограммы, но такой подход мне кажется не очень удобным, хотя и гарантирует уникальность каждой метки.

В общем, прошу поделиться опытом решение описаной проблем (хотя конечно проблемой это назвать очень сложно smile.gif).

P.S. Используемая среда MPLAB IDE v.7.30
Kirill Frolov
Цитата(Grigorij @ Mar 31 2008, 14:29) *
Конечно можно к имени метки добавлять еще и название подпрограммы, но такой подход мне кажется не очень удобным,
хотя и гарантирует уникальность каждой метки.


Адекватные ассемблеры позволяют @@locallabel или накрайнял числовые метки вида "3:".

Цитата
P.S. Используемая среда MPLAB IDE v.7.30


Все вопросы к билу гейцу.
Grigorij
Цитата(Kirill Frolov @ Mar 31 2008, 23:35) *
Адекватные ассемблеры позволяют @@locallabel или накрайнял числовые метки вида "3:".


Меня интересовало не то как это делается в "адекватных ассемблерах", а то как это же "красиво" сделать в mpasm.

Использование же во всей программе меток вида "1:", "2:" и т.д., тоже считаю не идеальным решением, т.к. название метки не несет какой-либо смысловой нагрузки и, в добавок ко всему, надо помнить номера меток, уже использованных в программе.

Цитата(Kirill Frolov @ Mar 31 2008, 23:35) *
Все вопросы к билу гейцу.


А он то здесь при чем?
vanner
Во первых разберись что такое макрос - это совсем не подпрограмма. Использовать метки в макросах нельзя. Если уж сильно нужен макрос и переходы в нем, то можешь использовать конструкции типа goto $+n.
Grigorij
Цитата(vanner @ Apr 1 2008, 10:06) *
Во первых разберись что такое макрос - это совсем не подпрограмма.


Я нигде не говорил, что макрос - это подпрограмма. С чего Вы это взяли?

Цитата(vanner @ Apr 1 2008, 10:06) *
Использовать метки в макросах нельзя.


Почему? Где это можно прочитать?
Возможно я не правильно понимаю назначение директивы LOCAL. Разве в следующем коде:

Код
NAME_OF_MACRO MACRO1

    LOCAL _finally

        ;какие-либо действия
          goto _finally
        ;какие-либо действия

    _finally:
      
        ;какие-либо действия

ENDM


_finally - не будет являться именно локальной меткой макроса NAME_OF_MACRO?

Цитата(vanner @ Apr 1 2008, 10:06) *
Если уж сильно нужен макрос и переходы в нем, то можешь использовать конструкции типа goto $+n.


Я так понимаю goto $+n - это переход на n строк вперед. На мой взгляд, такой подход крайне неудобен, при n >= 2. Сопровождение и отладка кода, где используются конструкции вида goto $+10, опять же на мой взгляд, смерти подобна.

А вообще вопрос касался подпрограмм, а не макросов.
Bronislav
_finally - не будет являться именно локальной меткой макроса NAME_OF_MACRO?

Локальная метка видна только внутри макроса. А в Ваших подпрограммах мне кажется лучше применить
call _finally.
Вообще-то переход goto $+n или goto $-n очень помогает внутри небольших макросов избежать локальных меток, только внутри этого перепрыгивания не должно быть вызовов других подпрограмм или макросов.
blackbit
Если речь о подпрограммах, то в случае одинакового кода после _finally несколько подпрограмм можно объединить в одну, имеющую несколько точек входа и одну точку выхода:
Код
NAME_OF_PROC1:

        ;какие-либо действия
          goto _finally

NAME_OF_PROC2:

        ;какие-либо действия
          goto _finally

NAME_OF_PROC3:

        ;какие-либо действия
          goto _finally


NAME_OF_PROC4:

        ;какие-либо действия

    _finally:
      
        ;какие-либо действия

RETURN


Получается мощно и экономно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.