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

 
 
 
Reply to this topicStart new topic
> "Локальные" метки в подпрограмме, Борьба за читабельность кода
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
Kirill Frolov
сообщение Mar 31 2008, 19:35
Сообщение #2


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

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



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


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

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


Все вопросы к билу гейцу.


--------------------
[ZX]
Go to the top of the page
 
+Quote Post
Grigorij
сообщение Apr 1 2008, 04:25
Сообщение #3


Участник
*

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



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


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

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

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


А он то здесь при чем?
Go to the top of the page
 
+Quote Post
vanner
сообщение Apr 1 2008, 06:06
Сообщение #4


Участник
*

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



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


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #6


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

Группа: Участник
Сообщений: 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
blackbit
сообщение Apr 10 2008, 11:22
Сообщение #7


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

Группа: Новичок
Сообщений: 100
Регистрация: 5-03-07
Пользователь №: 25 892



Если речь о подпрограммах, то в случае одинакового кода после _finally несколько подпрограмм можно объединить в одну, имеющую несколько точек входа и одну точку выхода:
Код
NAME_OF_PROC1:

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

NAME_OF_PROC2:

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

NAME_OF_PROC3:

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


NAME_OF_PROC4:

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

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

RETURN


Получается мощно и экономно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:16
Рейтинг@Mail.ru


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