Jump to content
necr0filius

Мк51 (at89x51) Ошибка Relative Jump Too Large

Recommended Posts

Компилятор на команду

jnb e0h, error

выдает сообщение relative jump too large, соответсвенно тогда когда метка (error) находится на некотором большем удалениии от команды jnb чем следовало бы.

В документации на кросс-ассемблер в разделе ошибок, причина возникновения этой объясняется следующим:

===

Ошибка RELATIVE JUMP TOO LARGE (Слишком далекий относительный переход) Значение Результирующий адрес перехода находится на другой

странице.

ВОПРОС: какую директиву нужно указать, для успешной компиляции программы и есть ли она?

Если нету, что в этом случае можете посоветовать сделать?

Share this post


Link to post
Share on other sites

не относительным перходом а прямым...


«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

Share this post


Link to post
Share on other sites

относительный переход по такой команде +127..-128 байт, естественно будет ошибка если метка отстоит далее.

надо так:

jb e0h,noerror ; если бит взведен то продолжить выполнение программы,

ljmp error ; иначе прыгнуть к error.

noerror: ............ ;выполняем далее программу

Share this post


Link to post
Share on other sites

Вебинар "Разбор новых уникальных модулей FMAC и CORDIC в микроконтроллерах общего назначения STM32G4" (15.07.2020)

Компания КОМПЭЛ приглашает вас принять участие в вебинаре 15.07.2020, посвященном новому семейству микроконтроллеров общего назначения – STM32G4. Вебинар рассчитан на технических специалистов и тех, кто знаком с основами цифровой обработки сигналов. Мы разберем алгоритм работы CORDIC, а также рассмотрим пример создания цифрового фильтра на базе FMAC.

Зарегистрироваться на вебинар

Юзай ajmp. Дальний переход. 51-ые камни эту команду любят... :)


Пока в груди моей бьётся мотор, надежда есть на чистый бензин...

Share this post


Link to post
Share on other sites
                     

Новые контроллеры VIPerPLUS для ИП – видео и материалы вебинара STMicroelectronics

Видеозапись и материалы вебинара ST о семействе AC/DC регуляторов VIPerPLUS производства компании STMicroelectronics. Инженерами ST было детально рассмотрено новое семейство микросхем VIPerPLUS со встроенным транзистором, их возможности и топологии применения. Продемонстрировано испытание из лаборатории ST в Праге и моделирование в среде E-DesignSuite.

Подробнее

2 Duhas - "не относительным перходом а прямым..." что ты имел ввиду?

2 Speccy - относительный переход по такой команде +127..-128 байт, естественно будет ошибка если метка отстоит далее.

надо так: jb e0h,noerror ; если бит взведен то продолжить выполнение программы,

ljmp error ; иначе прыгнуть к error.

noerror: ............ ;выполняем далее программу

так не получается, алгоритм построен подругому, это громоздко. Юзается блок выборки битов аккумулятора следующим образом.

Block:

JNB E0h,Label1

JNB E1h,Label2

JNB E2h,Label3

JNB E3h,Label4

Ret

Хочется так что бы не дописывать лишнего кода. Тут именно интересует, есть ли директива, хотя я теперь подозреваю что в состав кросс-ассемблера такая функция не входит. Так как команды jnb (jb,jz,jnz...) в своем составе имеют только один байт для адреса перехода в отличие от команды LCALL которая имеет для адреса два зарезервированных бита.

Выходит команды аналогичные jnb вычисляют адрес перехода путем "прибавления" смещения к PC, в отличие от LCALL которая имеет два байта и хранит сразу адрес перехода.

Share this post


Link to post
Share on other sites
                     

Конденсаторы ECWFG от Panasonic: теперь и для высоковольтных применений

Компания Panasonic анонсировала существенное расширение серии пленочных конденсаторов ECWFG: на сегодняшний день диапазон рабочих напряжений серии составляет 630…1100 В (DC). Серия ECWFG поддерживает уникальную функцию микропредохранителей.

Подробнее

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

Вам не хочется дописывать лишнего кода?

Вы наверное шутите? Или у Вас комар бита не подточит в этой программе, и места нету совершенно? Ни за что не поверю.

Этож машинные коды - тут либо так, либо эдак.

Говорю же вот выход:

Block:
	  jb 0E0h,NO_LABEL_1
	ljmp LABEL_1
NO_LABEL_1:
	  jb 0E1h,NO_LABEL_2
	ljmp LABEL_2
NO_LABEL_2:
	  jb 0E2h,NO_LABEL_3
	ljmp LABEL_3
NO_LABEL_3:
	  jb 0E3h,NO_LABEL_4
	ljmp LABEL_4
NO_LABEL_4:
	 ret

Код увеличился на 12 байт. Это что критично для Вас?

Есть еще с десяток способов как проверить биты аккумулятора, но все они связаны с относительным переходом, а он Вам не подходит по дальности перехода.

Share this post


Link to post
Share on other sites

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


«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

Share this post


Link to post
Share on other sites
Вам не хочется дописывать лишнего кода?

Вы наверное шутите? Или у Вас комар бита не подточит в этой программе, и места нету совершенно? Ни за что не поверю.

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

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

Share this post


Link to post
Share on other sites

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

Если это компилировать Keil-ом, то там наверняка есть оптимизация. Например удалить лишние прямые переходы. Или расположить куски кода таким образом, чтобы уменьшить кол-во переходов. На то он и компилятор.

А если ассемблировать "в лоб", то будет то, что написано в тексте как ни крути.

Добавлю еще, что если вышеприведенный пример действительно имеет место быть, то все переходы должны осуществляться в пределах от метки Block до команды ret. Не обязаны, но должны. Так как по оформлению это очень похоже на какую-то подпрограмму.

Иначе получается, что при входе в эту подпрограмму, и осуществлении перехода по условию, когда-нибудь придется делать ret. А команда ret в подпрограмме должна быть только одна. Не обязана, но должна. А в примере получается не совсем логичное построение.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • эта МС так и просится развернутся) а вообще - по опыту - пробовал запускать резонанс похожий - эти мс - как понял шипитильно относятся к ОС  , почему вы не присмотритесь к шиму попроще - например - этот http://www.radioradar.net/datasheet_search/D/M/0/DM0565R_FairchildSemiconductor.pdf.html  те же 60 ватт , не так круто как резонанс - но зато не вынесет мозг) а к этим МС лучще подходить с опытом . имхо.
    • Вы показали фото и задали вопрос. Вам ответили. А что ещё у вас в кладовке с двойными контактами дело десятое. Вообще двойные контакты ставят на бюджетные бошки для экономии проводов-сильно урезанный бивайринг.  8-омный импенданс Zo постоянному току будет определяться прибором как Re 6.4ом.
    • не пробовал, но только за. 33*2 получится 66кОм. Ближайший на 68кОм. поставлю его. Поставлю один. 47*4=188кОм. тут либо 180кОм или 200кОм. а если тут критично сопротивление, то тогда уже может 180кОм и 8,2кОм. поставлю 2 резистора, а если можно 180кОм - вместо второго впаяю перемычку. В оригинальной схеме вообще стоит 18+18+18+33=87кОм, а на плате стоят 4 резистора по 47кОм. может не просто так 4 штуки поставили... вообще изначально дорожки рисую 1-1.5мм, где не критична толщина, а потом, если позволяет расположение деталей, то уже увеличиваю дорожки и делаю полигонами. R3 оставил пока так, но можно и перенести. С4 тоже можно вынести к R3, если его расположение не критично возле 5 вывода микросхемы... 6551.zip
    • Я могу сформулировать зеркальный эффект. Это когда "служба поддержки" или советчики настойчиво пытаются решить проблему т.с. клиента неприемлемым для него способом. Так как у них уже есть готовый стереотип решения данного класса проблем. Хотя у "клиента" ситуация не обязательно типичная. Я бы назвал это "нам лучше знать что вам нужно".
    • По одному выходу из каждого моста смотреть не вариант?
×
×
  • Create New...