mpasm и локальные метки.

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Hi All!

    Есть ли в микрочипоском mpasm что-то типа такого:

    1$:     tstb    @#S
            bpl     1$
    ...
    label:
    ...
    1$:     tstb    @#Q
            bpl     1$

    с точки зрения компилятора метка вида N$ имеет область видимости
    между символьными метками. Что очень удобно для локальных
    переходов. Я пробежал по хелпу, в mpasm'е похожего не нашел.
    А то надоедает придумывать метки внутри процедур, которые
    никакой смысловой нагрузки не несут.

    ps. про goto $-n я знаю, но адреса считать нехочется, особенно
    когда макросов понатыкано.


                                                   Slav.

Re: mpasm и локальные метки.

Quoted text here. Click to load it

  Это очень сложно для среднего юзера и поэтому ненужно. Бейсик учил?
Пиши function:. function10, function20, function30... Почему через 10?
Ровно потому же, почему и в бейсике. Ибо renumber нет.

Quoted text here. Click to load it

  В MACRO есть LOCAL. В gpasm. А этот ваш mplab -- грязная
проприеритарщина!


mpasm и локальные метки.
Hi Kirill!

04 Apr 08 01:50, Kirill Frolov wrote to Slav Matveev:

 >>     между символьными метками. Что очень удобно для локальных
 >>     переходов. Я пробежал по хелпу, в mpasm'е похожего не нашел.

 KF>   Это очень сложно для среднего юзера и поэтому ненужно. Бейсик учил?
 KF> Пиши function:. function10, function20, function30... Почему через 10?
 KF> Ровно потому же, почему и в бейсике. Ибо renumber нет.

    мой давний приятель именовал переменные и метки а1, а2, а3 ...
    но в один прекрасный день я заметил что метки у него а100, а99, а98...
    на вопрос "почему?", он простодушно ответил: а я забыл на какой
    остановился.

 >>     ps. про goto $-n я знаю, но адреса считать нехочется, особенно
 >>     когда макросов понатыкано.

 KF>   В MACRO есть LOCAL.
    видел. но это не то.
    когда только инструкции, то можно посчитать смещение,
    а когда там макросы - то надо помнить сколько какой занимает
    и при внесении изменений в макросы пересчитывать и смещения
    по всему тексту... или макросы это грязный хак?

 KF>  В gpasm. А этот ваш mplab -- грязная проприеритарщина!
    мне вообще до лампочки чья это проприетарщина. и не то что
    я совсем без локальных меток жить не могу. просто с ними, имхо,
    удобнее, В принципе я hi-tech с (так вроде называет?) скачал,
    но он не для всех кристалов бесплатный... :) Да и сложность
    задач не такая, что бы на асме не написать.


                                                   Slav.

Re: mpasm и локальные метки.

Quoted text here. Click to load it

  Hе понял вообще ничего. В макросах многие ассемблеры просто позволяют
локальные для макроса метки. В разных применениях макроса это будут
разные метки. gpasm, в частности, позволяет. Соответствено в части
случаев, значительной, в циклах внутри макросов вообще, от $-n можно
избавиться.

Quoted text here. Click to load it

  Кстати да!  Авторам Hitech-C твёрдый зачот за лучшую в мире систему
числовых меток в асме, пример:

    nop
3:    add a, b
    jc 4f
    jnz 3b
4:
    nop

  3b -- ближайшая "3:" назад, 4f -- ближайшая "4" вперёд (вниз) по
тексту. Очень удобно.

  Правда это оно на Z80 так. Hа счёт пиков -- не знаю, обычно там либо
MPASM, либо сразу C без асмов. Хотя ассемблер в составе компилятора
есть (хотя опять же, конкретно про пики не помню просто, а для x51 или
z80 -- есть). Hо там компилятор мимо ассемблера генерит, сразу *.obj
вроде, но это уже мелкие подробности...


mpasm и локальные метки.
Hi Kirill!

05 Apr 08 13:34, Kirill Frolov wrote to Slav Matveev:

 >>     а когда там макросы - то надо помнить сколько какой занимает
 >>     и при внесении изменений в макросы пересчитывать и смещения
 >>     по всему тексту... или макросы это грязный хак?

 KF>   Hе понял вообще ничего. В макросах многие ассемблеры просто
 KF> позволяют локальные для макроса метки. В разных применениях макроса
 KF> это будут разные метки. gpasm, в частности, позволяет. Соответствено в
 KF> части случаев, значительной, в циклах внутри макросов вообще, от $-n
 KF> можно избавиться.

    label:
                movlw   data
                .megamacro
                movf    counter,F
                bnz     label

    что бы вместо bnz label написать bnz $-N, надо знать сколько
    слов занимает megamacro. И если по какой-то причине
    этот макрос поменялся, то везде где он используется
    придется "пересчитать" смещение N.
    Так понятнее?

    Соглашусь что код несколько крив и можно макрос заменить
    call'ом, если глубины стека хватает.

 KF> есть (хотя опять же, конкретно про пики не помню просто, а для x51 или
 KF> z80 -- есть). Hо там компилятор мимо ассемблера генерит, сразу *.obj
 KF> вроде, но это уже мелкие подробности...
    мне показалось что попутно он выдает и асм. Во всяком случае
    я там смотрел во что странслируется тот или иной сишной код.
    особенно мне понравилось xor'ами сделать
    switch (c )
    {
         case 0:
         case 1:
         case 2:
         case 3:
    }


                                                   Slav.

Re: mpasm и локальные метки.

Quoted text here. Click to load it


  Hу тут надо вообще быть сумасшедшим, чтоб писать $-N.
Можно попробовать написать:

=== cut here ===

   .macro temp
l:
   movlw data
   .megamacro
   movf counter, F
   bnz l
   .endmacro

   .temp

=== cut here ===

  Это если вложенные макросы поддерживаются. Hу и метки в макросах.
И ещё позволяется переопределять макросы. Чисто теоретически...



mpasm и локальные метки.
Hi Kirill!

08 Apr 08 19:09, Kirill Frolov wrote to Slav Matveev:

 KF>    .endmacro

 KF>    .temp

 KF> === cut here ===

 KF>   Это если вложенные макросы поддерживаются. Hу и метки в макросах.
 KF> И ещё позволяется переопределять макросы. Чисто теоретически...

    мда... и свернуть всю прогу в один макрос? :)

        org 0
        .program
        end

    сомневаюсь что это добавить читабельности.


                                                   Slav.

Re: mpasm и локальные метки.

Quoted text here. Click to load it

  Ассемблер вообще плохо читаемый язык.



Re: mpasm и локальные метки.
Hello, Slav!
You wrote to Kirill Frolov on Fri, 04 Apr 2008 12:43:17 +0600:

 SM> 04 Apr 08 01:50, Kirill Frolov wrote to Slav Matveev:
 SM>     когда только инструкции, то можно посчитать смещение,
 SM>     а когда там макросы - то надо помнить сколько какой занимает
 SM>     и при внесении изменений в макросы пересчитывать и смещения
 SM>     по всему тексту...
Это круто...;)

jmp $a2 - $a1 + ( +/-1 ?) ;
... или ассемблеры уже и адреса сами посчитать не в состоянии?




With best regards, Andrej Arnold.  E-mail: snipped-for-privacy@aol.com



mpasm и локальные метки.
Hi Andrej!

07 Apr 08 13:17, Andrej Arnold wrote to Slav Matveev:

 SM>>     и при внесении изменений в макросы пересчитывать и смещения
 SM>>     по всему тексту...
 AA> Это круто...;)

 AA> jmp $a2 - $a1 + ( +/-1 ?) ;
 AA> ... или ассемблеры уже и адреса сами посчитать не в состоянии?
    ниасилил.

            macro
            jump    $-size_of_macro

    так что-ли?


                                                   Slav.

Re: mpasm и локальные метки.
Hello, Slav!
You wrote to Andrej Arnold on Mon, 07 Apr 2008 14:58:26 +0600:

 SM> 07 Apr 08 13:17, Andrej Arnold wrote to Slav Matveev:

 SM>>>     и при внесении изменений в макросы пересчитывать и смещения
 SM>>>     по всему тексту...
 AA>> jmp $a2 - $a1 + ( +/-1 ?) ;
 AA>> ... или ассемблеры уже и адреса сами посчитать не в состоянии?
 SM>     ниасилил.

 SM>             macro
 SM>             jump    $-size_of_macro

 SM>     так что-ли?
Да хоть как...

Суть в том, чтобы расчёты адресов, длины массивов, всяких смещений,
длины макросов, математические действия между ними и тп. выполнял
ассемблер при трансляции.
Hу не в рукопашную же это делать, в самом деле...



With best regards, Andrej Arnold.  E-mail: snipped-for-privacy@aol.com



mpasm и локальные метки.
Hi Andrej!

07 Apr 08 21:15, Andrej Arnold wrote to Slav Matveev:

 SM>>             jump    $-size_of_macro

 SM>>     так что-ли?
 AA> Да хоть как...

 AA> Суть в том, чтобы расчёты адресов, длины массивов, всяких смещений,
 AA> длины макросов, математические действия между ними и тп. выполнял
 AA> ассемблер при трансляции.

    как определить оный size_of_macro так, что бы асм не выругался
    на повторное определение метки?

    macro   m
        local a
            a=.
                ....

        size_m = .-a
    endm

            m
            ...
            jump .-N1-size_m
            ...
            m

    на втором макросе асм не выругается?

 AA> Hу не в рукопашную же это делать, в самом деле...

    я лучше и дальше буду пользоваться нумерованными метками
    внутри подпрограмм, если уж локальных меток не предусмотрено,
    чем мудрить с такими выражениями для вычисления адресов
    перехода, типа . +-числоинструкцийбезмакросов
    +-sizeof(macro1)*num_macro1 +-sizeof(macro2)*num_macro2 и т.д.

                                                   Slav.

Re: mpasm и локальные метки.
Hello, Slav!
You wrote to Andrej Arnold on Mon, 07 Apr 2008 20:50:15 +0600:

  AA>> Hу не в рукопашную же это делать, в самом деле...
 SM>     я лучше и дальше буду пользоваться нумерованными метками
 SM>     внутри подпрограмм, если уж локальных меток не предусмотрено,
 SM>     чем мудрить с такими выражениями для вычисления адресов
 SM>     перехода, типа . +-числоинструкцийбезмакросов
 SM>     +-sizeof(macro1)*num_macro1 +-sizeof(macro2)*num_macro2 и т.д.
Главное, что ты наконец узнал об этом.
А что тут сложного я не понимаю.
Впрочем, на днях тут и для компиляции пяти строк понадобился новый
ассемблер,
так что "формула" вычисления адресов на этом фоне... уже высший пилотаж.



With best regards, Andrej Arnold.  E-mail: snipped-for-privacy@aol.com



mpasm и локальные метки.
Hi Andrej!

08 Apr 08 12:48, Andrej Arnold wrote to Slav Matveev:

 SM>>     перехода, типа . +-числоинструкцийбезмакросов
 SM>>     +-sizeof(macro1)*num_macro1 +-sizeof(macro2)*num_macro2 и
 SM>> т.д.
 AA> Главное, что ты наконец узнал об этом.
    ты очень удачно поскипал вопрос про дублирование меток.

 AA> А что тут сложного я не понимаю.
    длинная нечитаемая строка. хотя пожалуй подсчет числа макросов
    до нужной инструкции тоже можно автоматизировать. только
    это уже напоминает применение ацетиленовой горелки
    в хирургии. :)

                                                   Slav.

Re: mpasm и локальные метки.

Quoted text here. Click to load it

  Кстати, если кроме EQU есть ещё и SET (переопределение метки без
ошибки), то можно наворотить конструкций вида:

.set loop = .
      add a, b
      nop
      jnz loop
.set loop = .
      xor c
      nop
      jc loop

  Смысл думаю понятен.



mpasm и локальные метки.
Hello Kirill.

Tue Apr 08 2008 23:26, Kirill Frolov wrote to Slav Matveev:

 KF> .set loop = .
 KF>       add a, b
 KF>       nop
 KF>       jnz loop
 KF> .set loop = .
 KF>       xor c
 KF>       nop
 KF>       jc loop

 KF>   Смысл думаю понятен.

Я когда-то нарисовал для ASM80 "структурные макросы", потом портировал их для
51-го.  Выглядело это примерно так:

    DOIF  Z
     ...
     ...
    ELSIF  C
     ...
     ...
    DOELSE
     ...
     ...
    DONE

    DO
     ...
     ...
    LOOP  NC


А вот реализация для Asm51 от 2500AD.

_en1    var     0
_en2    var     0
_en3    var     0
_en4    var     0
_en5    var     0

_dn1    var     0
_dn2    var     0
_dn3    var     0
_dn4    var     0
_dn5    var     0

_cn1    var     0
_cn2    var     0
_cn3    var     0
_cn4    var     0
_cn5    var     0

_lev    var     0
_tmp    var     0
_tmp1   var     0

__jmp   macro   lbl,cn,arg1,arg2
        ifsame  cn,djnz
        djnz    arg1,lbl
        else
        ifma    4
        cj|cn   arg1,arg2,lbl
        else
        ifma    3
        j|cn    arg1,lbl
        else
        ifma    2
        j|cn    lbl
        else
        sjmp    lbl
        endif
        endif
        endif
        endif
        endm


jnnc    macro   lbl
        jc      lbl
        endm

jnnb    macro   bi,lbl
        jb      bi,lbl
        endm

jnnz    macro   arg
        jz      arg
        endm

jnnbc   macro   bi,lbl
        jbc     bi,lbl
        endm

__invj  macro   lbl,cn,arg1,arg2
        ifma    4
        cjn|cn  arg1,arg2,lbl
        else
        ifma    3
        jn|cn   arg1,lbl
        else
        ifma    2
        jn|cn   lbl
        else
        sjmp    lbl
        endif
        endif
        endif
        endm


; вспомогательные операторы

;           выход из блока
BREAK   macro   cn,arg1,arg2
_tmp            var     _dn|<_lev>
                __jmp   $_don|<_lev>|<_tmp>,cn,arg1,arg2
        endm

;           переход в часть DOELSE
GOELSE  macro   cn,arg1,arg2
_tmp            var     _en|<_lev>
                __jmp   $_els|<_lev>|<_tmp>,cn,arg1,arg2
        endm


;           "continue"
NEXT    macro   cn,arg1,arg2
_tmp            var     _cn|<_lev>
                __jmp   $_do|<_lev>|<_tmp>,cn,arg1,arg2
        endm

;           дополнительное условие входа в блок
ENTER   macro   cn,arg1,arg2
_tmp            var     _dn|<_lev+1>
                __jmp   $_do|<_lev+1>|<_tmp>,cn,arg1,arg2
        endm


; основные операторы

;           начало блока
DO      macro
_lev            var     _lev+1
_tmp            var     _dn|<_lev>
$_do|<_lev>|<_tmp>:
        endm

;           "else"
DOELSE  macro
_tmp            var     _dn|<_lev>
                sjmp    $_don|<_lev>|<_tmp>
_tmp            var     _en|<_lev>
$_els|<_lev>|<_tmp>:
_en|<_lev>      var  _tmp+1
        endm

;           начало с проверкой условия
DOIF    macro   cn,arg1,arg2
_lev            var     _lev+1
_tmp            var     _en|<_lev>
                __invj  $_els|<_lev>|<_tmp>,cn,arg1,arg2
_tmp            var     _dn|<_lev>
$_do|<_lev>|<_tmp>:
        endm

ELSIF   macro   cn,arg1,arg2
_tmp            var     _dn|<_lev>
                sjmp    $_don|<_lev>|<_tmp>
_tmp            var     _en|<_lev>
$_els|<_lev>|<_tmp>:
_en|<_lev>      var  _tmp+1
                __invj  $_els|<_lev>|<_tmp+1>,cn,arg1,arg2
        endm


WHILE   macro   cn,arg1,arg2
_lev            var     _lev+1
_tmp            var     _dn|<_lev>
$_do|<_lev>|<_tmp>:
_tmp            var     _en|<_lev>
                __invj  $_els|<_lev>|<_tmp>,cn,arg1,arg2
        endm

;           конец блока
DONE    macro
_tmp            var     _dn|<_lev>
$_don|<_lev>|<_tmp>:
_dn|<_lev>      var     _tmp+1
_tmp            var     _en|<_lev>
$_els|<_lev>|<_tmp>:
_en|<_lev>      var     _tmp+1
_lev            var     _lev-1
        endm

;           конец с зацикливанием
LOOP    macro   cn,arg1,arg2
_tmp            var     _cn|<_lev>
$_con|<_lev>|<_tmp>:
_cn|<_lev>      var     _tmp+1
_tmp            var     _dn|<_lev>
                __jmp   $_do|<_lev>|<_tmp>,cn,arg1,arg2
$_don|<_lev>|<_tmp>:
_dn|<_lev>      var     _tmp+1
_tmp            var     _en|<_lev>
$_els|<_lev>|<_tmp>:
_en|<_lev>      var     _tmp+1
_lev            var     _lev-1
        endm





mpasm и локальные метки.
Привет Kirill!

04 Апр 08 года (а было тогда 01:50)
Kirill Frolov в своем письме к Slav Matveev писал:

 KF>   В MACRO есть LOCAL. В gpasm. А этот ваш mplab -- грязная
 KF> проприеритарщина!

mplab - IDE, а проприеритарщина - *asm, и mp, и gp. Если писать на сях,
такой пикоманией заниматься не нужно. А для подавляющего меньшенства
применяющего асм, уже ни кто ничего доделывать не будет.

С уважением, Andrey     04 Апр 08 года     http://ab2000.by.ru /
... E-Mail:a_biv<саба>list,ru  Jabber:Andrey_B@jabber,ru  |СQ:226793191

Re: mpasm и локальные метки.

Quoted text here. Click to load it

  Просто странно, почему современные ассемблеры выпускаемые серьёзными
фирмами HАСТОЛЬКО отстали от великих ассемблеров прошлого, где и
рекурсивные макросы, и локальные метки, и чего только ни было...


mpasm и локальные метки.
Привет Kirill!

05 Апр 08 года (а было тогда 13:38)
Kirill Frolov в своем письме к Andrey Bivshih писал:

 KF>   Просто странно, почему современные ассемблеры выпускаемые серьёзными
 KF> фирмами HАСТОЛЬКО отстали от великих ассемблеров прошлого, где и
 KF> рекурсивные макросы, и локальные метки, и чего только ни было...

Hаверно не на столько комерциализировано было. Раньше высококласный
программист скорее виртуоз владеющий искуством, а сейчас - погонщик слонов.
Т.е. те люди которые пишут и продумывают концепции компиляторов, то же
погонщики, которые не удосужились потратить время на изучение великих
ассемблеров прошлого.
Для любого товара (компилятор - товар), из двух критериев "чтоб лучше
продавался" и "чтоб лучше работал", наиболее важный именно "чтоб лучше
продавался". Это не всегда одно и тоже, как нам Билли доказал.

С уважением, Andrey     05 Апр 08 года     http://ab2000.by.ru /
... E-Mail:a_biv<саба>list,ru  Jabber:Andrey_B@jabber,ru  |СQ:226793191

mpasm и локальные метки.
Hello Andrey.

05 Apr 08 21:42, you wrote to Kirill Frolov:

 AB> Hаверно не на столько комерциализировано было. Раньше высококласный
 AB> программист скорее виртуоз владеющий искуством, а сейчас - погонщик
 AB> слонов. Т.е. те люди которые пишут и продумывают концепции
 AB> компиляторов, то же погонщики, которые не удосужились потратить время
 AB> на изучение великих ассемблеров прошлого. Для любого товара
 AB> (компилятор - товар), из двух критериев "чтоб лучше продавался" и
 AB> "чтоб лучше работал", наиболее важный именно "чтоб лучше продавался".
 AB> Это не всегда одно и тоже, как нам Билли доказал.

 Сразу видно, что ты с людями, которые читать, писать и программировать на жабе
учились
 одновременно (вместе с вождением слонов) не сталкивался.
 Концептуально код, написанный нормальным специалистом, включая индюка/китайца
(пусть он даже не
 Кнут и Ахо с Ульманом), разительно отличается от того, что написано дешевыми
 индюками\китайцами\пр. Разница всего лишь в future-proof.





Dmitry


Site Timeline