реклама на сайте
подробности

 
 
> "Локальные" метки в подпрограмме, Борьба за читабельность кода
Grigorij
сообщение Mar 31 2008, 11:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Здравствуйте.

В процессе изучения ассемблера и написания программы для 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vanner
сообщение Apr 1 2008, 06:06
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 23-10-05
Пользователь №: 10 016



Во первых разберись что такое макрос - это совсем не подпрограмма. Использовать метки в макросах нельзя. Если уж сильно нужен макрос и переходы в нем, то можешь использовать конструкции типа goto $+n.
Go to the top of the page
 
+Quote Post
Grigorij
сообщение Apr 1 2008, 08:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Цитата(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, опять же на мой взгляд, смерти подобна.

А вообще вопрос касался подпрограмм, а не макросов.
Go to the top of the page
 
+Quote Post
Bronislav
сообщение Apr 2 2008, 00:53
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 118
Регистрация: 23-01-06
Пользователь №: 13 477



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

Локальная метка видна только внутри макроса. А в Ваших подпрограммах мне кажется лучше применить
call _finally.
Вообще-то переход goto $+n или goto $-n очень помогает внутри небольших макросов избежать локальных меток, только внутри этого перепрыгивания не должно быть вызовов других подпрограмм или макросов.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016