necr0filius Опубликовано 16 июня, 2007 Поделиться Опубликовано 16 июня, 2007 Компилятор на команду jnb e0h, error выдает сообщение relative jump too large, соответсвенно тогда когда метка (error) находится на некотором большем удалениии от команды jnb чем следовало бы. В документации на кросс-ассемблер в разделе ошибок, причина возникновения этой объясняется следующим: === Ошибка RELATIVE JUMP TOO LARGE (Слишком далекий относительный переход) Значение Результирующий адрес перехода находится на другой странице. ВОПРОС: какую директиву нужно указать, для успешной компиляции программы и есть ли она? Если нету, что в этом случае можете посоветовать сделать? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Duhas Опубликовано 16 июня, 2007 Поделиться Опубликовано 16 июня, 2007 не относительным перходом а прямым... 0 «Как сердцу выразить себя? … Мысль изреченная есть ложь!» Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Speccy Опубликовано 16 июня, 2007 Поделиться Опубликовано 16 июня, 2007 относительный переход по такой команде +127..-128 байт, естественно будет ошибка если метка отстоит далее. надо так: jb e0h,noerror ; если бит взведен то продолжить выполнение программы, ljmp error ; иначе прыгнуть к error. noerror: ............ ;выполняем далее программу 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Zer Опубликовано 16 июня, 2007 Поделиться Опубликовано 16 июня, 2007 Юзай ajmp. Дальний переход. 51-ые камни эту команду любят... 0 Пока в груди моей бьётся мотор, надежда есть на чистый бензин... Ссылка на комментарий Поделиться на другие сайты Поделиться
necr0filius Опубликовано 16 июня, 2007 Автор Поделиться Опубликовано 16 июня, 2007 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 которая имеет два байта и хранит сразу адрес перехода. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Speccy Опубликовано 17 июня, 2007 Поделиться Опубликовано 17 июня, 2007 Подозреваю что нету такой директивы, потому что это ассемблер а не компилятор. Вам не хочется дописывать лишнего кода? Вы наверное шутите? Или у Вас комар бита не подточит в этой программе, и места нету совершенно? Ни за что не поверю. Этож машинные коды - тут либо так, либо эдак. Говорю же вот выход: 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 байт. Это что критично для Вас? Есть еще с десяток способов как проверить биты аккумулятора, но все они связаны с относительным переходом, а он Вам не подходит по дальности перехода. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Duhas Опубликовано 17 июня, 2007 Поделиться Опубликовано 17 июня, 2007 ну вот я об этом и говорил .. JNB выполняет относительный переход - тоесть смещение на n относительно данного адреса... если дальнобойности относительного перехода нехватает то вариант Speccy тут мен кажется чуть ли не идальным.. 0 «Как сердцу выразить себя? … Мысль изреченная есть ложь!» Ссылка на комментарий Поделиться на другие сайты Поделиться
necr0filius Опубликовано 17 июня, 2007 Автор Поделиться Опубликовано 17 июня, 2007 Вам не хочется дописывать лишнего кода?Вы наверное шутите? Или у Вас комар бита не подточит в этой программе, и места нету совершенно? Ни за что не поверю. Я и не говорил что это совсем критично, пришлось добавлять, а что делать, сроки жмут... Просто пока было времени немножко подумать, и поискать такого рода выход, думал и искал, как времени не стало, так и реализовал похожим образом, иначе и правда никак. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Speccy Опубликовано 17 июня, 2007 Поделиться Опубликовано 17 июня, 2007 Должно зависеть от того чем текст превращается в машинный код. Если это компилировать Keil-ом, то там наверняка есть оптимизация. Например удалить лишние прямые переходы. Или расположить куски кода таким образом, чтобы уменьшить кол-во переходов. На то он и компилятор. А если ассемблировать "в лоб", то будет то, что написано в тексте как ни крути. Добавлю еще, что если вышеприведенный пример действительно имеет место быть, то все переходы должны осуществляться в пределах от метки Block до команды ret. Не обязаны, но должны. Так как по оформлению это очень похоже на какую-то подпрограмму. Иначе получается, что при входе в эту подпрограмму, и осуществлении перехода по условию, когда-нибудь придется делать ret. А команда ret в подпрограмме должна быть только одна. Не обязана, но должна. А в примере получается не совсем логичное построение. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.