Перейти к содержанию

Как написать в ассемблере переход без меток?


oleg st

Рекомендуемые сообщения

16 часов назад, AvrAsm сказал:

Лень эти метки выдумывать. Да и текст они засоряют изрядно.

Часть кода где это использую обрамляю комментариями

вот, комментарии, как раз, и засоряют текст. а метка сразу видна и понятна без комментариев.

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

1 час назад, ARV сказал:

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

@ARV , не могли бы Вы показать примерчик кода, в котором именно вычисляется адрес перехода каким то математическим выражением (мне для личного опыта).

Мне только встречались массивы адресов из которых выбирается вариант перехода. Сами же адреса вычислялись компилятором по меткам листинга и прописывались в массив.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Не знаю за другие компиляторы, в avr-studio число означает количество слов, а не команд.

Вам уже неоднократно сказали, используйте метки. У каждой подпрограммы своя маска меток.

Не вижу смысла дальше участвовать в обсуждении использовать или не использовать метки. Я когда писал на асме, матерился, но использовал метки.

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

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Геннадий сказал:

@ARV , не могли бы Вы показать примерчик кода, в котором именно вычисляется адрес перехода каким то математическим выражением (мне для личного опыта).

Хоть вопрос и не мне, но попробую ответить как я это вижу.

Например есть таблица из последовательно расположенных пп одинакового размера.

Нужно выполнить одну из них согласно содержимому некоего регистра.

Загружаем в указатель адрес начала таблицы, добавляем содержимое регистра умноженное на  размер пп и выполняем IJMP/ICALL.

Чем не математическое выражение, и сложение и умножение есть. :rolleyes:

 

Изменено пользователем AvrAsm
Ссылка на комментарий
Поделиться на другие сайты

Теоретически - ДА. А на практике?..

Адрес начала таблицы вычисляет компилятор из метки?

Размер пп Вы сами намерены подсчитывать, чтобы подсунуть его в алгоритм вычисления перехода? А при доработках пп придется корректировать еще и константу для некоего регистра, участвующего в расчете перехода!

Есть ли смысл нагружать МК расчетом таких переходов? Кроме гимора ничего не приходит на ум.

Чаще встречается так. При старте программы создается массив адресов переходов (фиксированный размер адреса 2 байта). А в теле программы выбирается тот или иной адрес, помещаемый в индексный регистр, и производится переход. Опять таки, для создания массива нужны метки, если конечно нет желания считать переходы на калькуляторе и забивать их значения вручную (до первой модификации пп). Но и здесь "математики" не видно, одна логика...

Ссылка на комментарий
Поделиться на другие сайты

Вы просили :

Цитата

показать примерчик кода, в котором именно вычисляется адрес перехода каким то математическим выражением

Я дал алгоритм с использованием математического выражения.

Что не так? 

И да, если мне важно одинаковое время выполнения всех пп в таблице, то буду даже такты считать а не только размер пп!

И вообще, я не против меток, а ЗА!

Ссылка на комментарий
Поделиться на другие сайты

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

Речь всего лишь о том, что некоторым хочется собственные привычки выдавть за догмы, которым обязаны следовать все остальные. А это не так. Если в системе команд МК присутствует команда относительного перехода на заданное количество ячеек - этой командой можно пользоваться. Только и всего.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Геннадий сказал:

Адрес начала таблицы вычисляет компилятор из метки?

Не обязательно. При желании можно и без метки обойтись.

ldi	ZH,byte2(PC+...+2)
ldi	ZL,byte1(PC+...+1)

вместо ... подставить нужное смещение относительно след. адреса.

Ссылка на комментарий
Поделиться на другие сайты

Вы считаете это решение удачным? И так для каждого перехода только потому, что влом придумывать наименования адреса перехода (метку).

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

Ссылка на комментарий
Поделиться на другие сайты

Вы издеваетесь???

Вы спросили : "Адрес начала таблицы вычисляет компилятор из метки"?

Я ответил что можно без метки загрузить указатель адресом начала таблицы пп при большом желании.

Удачно это или нет - дело десятое.

Причём здесь косвенные переходы?

И операндом выступает именно смещение относительно счётчика PC!

По Вашему (PC+5+2) или (PC-25+2) это абсолютный адрес?

Изменено пользователем AvrAsm
Ссылка на комментарий
Поделиться на другие сайты

Все что Вы показали, конечно же можно делать в ручную. Вот только зачем? Зачем присваивать, рассчитанный на калькуляторе адрес, индексному регистру, делать дальнейшие вычисления смещения (относительно этого адреса), получать значения для косвенного перехода (а именно только он примет внешние данные) в виде АБСОЛЮТНОГО АДРЕСА (другими он не оперирует), грузить их в индексный регистр (опять!!!), чтобы потом сделать переход? Неужели только из-за лени придумать название метки?

Все то, что Вы мне пытаетесь показать, я и сам прекрасно знаю. Знаю, как выполнить задачу четко и лаконично, а как "через жопу". Я всегда считал Ассм языком больших возможностей. Но не могу понять ЗАЧЕМ ДЕЛАТЬ ТО, ЧТО ДЕЛАТЬ МОЖНО, НО КРАЙНЕ НЕУДОБНО.

54 минуты назад, AvrAsm сказал:

По Вашему (PC+5+2) или (PC-25+2) это абсолютный адрес?

Кстати, попробуйте сделать переход IJMP по адресу, рассчитанному (PC+5+2). Попадете ли Вы туда, куда метили. 

Ссылка на комментарий
Поделиться на другие сайты

37 минут назад, Геннадий сказал:

Вот только зачем?

Сначала Вы спрашиваете как? Когда Вам отвечают как, Вы спрашиваете зачем. Это шедеврально! :D

 

37 минут назад, Геннадий сказал:

Попадете ли Вы туда, куда метили. 

Что в результате загрузки в регистр указатель окажется туда и попаду.

Изменено пользователем AvrAsm
Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, AvrAsm сказал:

Сначала Вы спрашиваете как?

Когда я такое спрашивал?

Что-то Вы мои вопросы поняли не так. Наверное неправильно переходы пересчитали.:)

Ссылка на комментарий
Поделиться на другие сайты

58 минут назад, Геннадий сказал:

ЗАЧЕМ ДЕЛАТЬ ТО

Вы слыхали о перемещаемых кодах? Т.е. таких блоках кода, которые можно поместить по любому адресу в памяти и они будут работать, как ни в чем ни бывало? Надеюсь, слыхали, а то рассказывать тонкости не охота. Так вот, при сборке проектов, состоящих из модулей на Си и ассемблере, надо обеспечить, чтобы код каждого модуля был перемещаемым. Во всяком случае, желательно так делать, чтобы линкер потом мог помещать модули в любые доступные адреса. Так что вопрос ЗАЧЕМ не должен ставиться - можно, значит, иной раз и нужно. Код с метками линкер обязан обработать, скорректировав все "метки" самостоятельно, если перемещает блок кода в иные адреса (не те, для которых модуль собирался).

Как-то так. Ясное дело, данный пример не шибко актуальный - линкер, все-таки, спавляется и с абсолютными адресами... Но идея должна быть понятна. Особенно это актуально для платформ, способных исполнять код из ОЗУ, например, ARM: там линкера внутри МК нет, и надо просто загрузить код из флеш в ОЗУ, чтобы потом его испольнить. Ясное дело, адреса будут разные, и код с абсолютной адресацийе переходов работать не будет.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

ARV, Ваш пример мне понятен. Однако мы говорим сейчас об AVR и ассемблере. Я думал почерпну у Вас что-то полезное в этом направлении... Получается, что нет.

Меня сбили с толку следующие ваши высказывания:

13 часов назад, AvrAsm сказал:

Или Вы про ijmp, icall ?

 

12 часов назад, ARV сказал:

Угу. В других платформах и иные есть.

Думал, вот сейчас мне все "разжуют" и я подучусь немного у Вас с AvrAsm. Однако ничего толкового вы не привели. Жаль...

И еще раз повторюсь. У AVR в косвенных переходах IJMP и др. используется индексный регистр Z, в который заносится только абсолютный адрес, косвенная адресация типа PC+xx для них не применима. Получается Ваш пример не про ijmp, icall...

На сим считаю нашу полемику оконченной. Всем добра.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, Геннадий сказал:

И еще раз повторюсь

Повторяться не надо, вместо этого загляните листинг, генерируемый каким-либо компилятором Си, и вы увидите там немало мнемоник именно "относительной" адресации переходов. Если звезды зажигают, значит, это кому-нибудь нужно...

Адресация типа PC+xxxx в ассемблере AVR используется в командах RJMP и RCALL: вы можете писать там абсолютный адрес, и компилятор вычислит смещение относительно текущего PC, и именно это смещение вставит в опкод. Вы можете сразу писать это самое смещение - никто не запретит, и тогда компилятор не будет ничего вычислять. Второй способ - это как раз способ писать без меток. Да, это сложнее, но вполне  возможно.

6 минут назад, Геннадий сказал:

И еще раз повторюсь

Повторяться не надо, вместо этого загляните листинг, генерируемый каким-либо компилятором Си, и вы увидите там немало мнемоник именно "относительной" адресации переходов. Если звезды зажигают, значит, это кому-нибудь нужно...

Адресация типа PC+xxxx в ассемблере AVR используется в командах RJMP и RCALL: вы можете писать там абсолютный адрес, и компилятор вычислит смещение относительно текущего PC, и именно это смещение вставит в опкод. Вы можете сразу писать это самое смещение - никто не запретит, и тогда компилятор не будет ничего вычислять.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, ARV сказал:

Адресация типа PC+xxxx в ассемблере AVR используется в командах RJMP и RCALL: вы можете писать там абсолютный адрес...

Разве этого кто-то из нас не знал?

Вы мой пост выше читали? Приходится повторяться, разговор был про IJMP, ICALL, а они несколько отличаются от Ваших RJMP, RCALL (коими приходится чаще пользоваться, чем моргать глазами). Не о том Вы.

Ссылка на комментарий
Поделиться на другие сайты

36 минут назад, Геннадий сказал:

У AVR в косвенных переходах IJMP и др. используется индексный регистр Z, в который заносится только абсолютный адрес

Ну да в Z может быть только абсолютный адрес, только этот адрес должен вычисляться во время выполнения программы а не при компиляции если нужно иметь возможность размещать этот код по любому адресу.

Ссылка на комментарий
Поделиться на другие сайты

42 минуты назад, Геннадий сказал:

Не о том Вы

Вы пытаетесь меня столкнуть на какое-то своё поле, а я придерживаюсь того, что говорил изначально. Я говорю не о вашем не потому, что вас не понял, а потому что и не пытаюсь что-либо о вашем сказать.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Геннадий сказал:

Хотел у Вас ценного опыта для себя почерпнуть...

Полезное на асме вы могли почерпнуть лет 10 назад, когда avr ещё как то котировались. Многие уже давно перешли на другие мк. Либо на си. И ассемблер забыли как страшный сон. Я учился у тех товарищей. Caxapa.ru, Electronix.ru. Там есть товарищи, которые ещё пишут на асме. Но ответят ли.

У ARV своеобразные понятия о программировании. У нас ним многое вразрез идёт.

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

@demiurg1978 , у меня понятия продиктованы исключительно жизненным опытом. И главное, что из этого опыта я вынес: не следуй догмам. Вы постоянно проповедуте догмы, а я знаю, что догм нет. Только и всего. Благодаря вашему догматическому подходу, вам сложно понимать других людей, которые, например, не озабочены автоматным программированием. И вам сложно использовать их наработки, потому что они не соответствуют вашим догмам. А ваши наработки большинству неинтересны, т.к. по той же причине непонятны и неудобны. Но вас ведь никто не принуждает забросить автоматное програмимрование? А вы всем сразу и безоговорочно заявляете, что ничего лучше нет и быть не может.

В основном, причина в этом.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

может кому пригодится ))
 

; -- умные условные переходы --

#define jump_calc int(abs(PC-@0)) <= int(64-((PC-@0)<0));условие вычисления прыжка -63...+64 = True

.macro RJEQ ; Jump ==        Skip !=
    .if    jump_calc
    breq    @0
    .else
    brne    lop
    rjmp    @0 lop:
    .endif    .endm

.macro RJNE ; Jump !=        Skip ==
    .if    jump_calc
    brne    @0
    .else
    breq    lop
    rjmp    @0 lop:
    .endif    .endm

.macro RJHI ; Jump >        Skip <=
    .if    jump_calc
    breq    L0
    brsh    @0 L0:
    .else
    brlo    lop
    breq    lop
    rjmp    @0 lop:
    .endif    .endm

.macro RJSH ; Jump >=        Skip <
    .if    jump_calc
    brsh    @0
    .else
    brlo    lop
    rjmp    @0 lop:
    .endif    .endm

.macro RJLO ; Jump <        Skip >=
    .if    jump_calc
    brlo    @0
    .else
    brsh    lop
    rjmp    @0 lop:
    .endif    .endm

.macro RJSL ; Jump <=        Skip >
    .if    jump_calc
    breq    @0
    brlo    @0
    .else
    breq    lup
    brsh    lop
lup:    rjmp    @0 lop:
    .endif    .endm

 

Изменено пользователем oleg st
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...