Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: rjmp и branch is out of reach
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
tazik
Почему ассемблер ругается (branch is out of reach) на следующий код?

Код
.org 0x00
    rjmp start

.org 0x96E
start:
    nop
    nop
    rjmp PC


Смотрим хелп по rjmp:
16-bit opcode
1100 kkkk kkkk kkkk, где kkkkkkk=требуемый адрес-1


0x96E=0b1001 0110 1110 - все вполне укладывается. Более того, есть работающая программа с таким кодом.

В чем дело?
V_G
rjmp прыгает на плюс-минус 2 кБайт (0x7FF), а старший бит - как раз знаковый. У вас явное превышение этого порога.
Прога может работать, если переход пришелся на незапрограммированную область памяти, которую проц пройдет мимо и начнет работу с запрограммированной (или с нуля, если все забито FF до конца).
rx3apf
Цитата(tazik @ Sep 27 2010, 10:26) *
Почему ассемблер ругается (branch is out of reach) на следующий код?

Смотрим хелп по rjmp:
16-bit opcode
1100 kkkk kkkk kkkk, где kkkkkkk=требуемый адрес-1

Смотрим там же - "-2K ≤ k < 2K". А 96E hex - это больше, чем 2K. Команда-то используется не только, чтобы переходить "вперед", но и "назад"...
Цитата
Более того, есть работающая программа с таким кодом.

Работающая на каком кристалле ? И для какого кристалла ругается компилятор ?
tazik
Цитата(rx3apf @ Sep 27 2010, 14:43) *
Смотрим там же - "-2K ≤ k < 2K". А 96E hex - это больше, чем 2K. Команда-то используется не только, чтобы переходить "вперед", но и "назад"...

Работающая на каком кристалле ? И для какого кристалла ругается компилятор ?


В общем-то, да, порог 2kB.
Кристалл Мега8.
Если открываю хекс в студии, то симуляция проходит. Если пишу ручками, как в примере, то ассемблер ругается при компиляции

начало hex-файла:
Код
:02 0000 02 0000 FC
:10 0000 00 6DC9 1895 1895 9CC1 1895 1895 1895 1895 4F
:10 0010 00 1895 83C1 1895 1895 1895 1895 CFC1 1895 FE


C96D - rjmp 0x96D

Нажмите для просмотра прикрепленного файла
Сергей Борщ
Цитата(tazik @ Sep 27 2010, 10:05) *
В общем-то, да, порог 2kB.
Кристалл Мега8.
У меги8 порог 2Кслов, т.е. вся память доступна при помощи rjmp. Поэтому команда jmp вообще отсутствует. Одна половина памяти доступна прыжком вперед (возможно с переполнением), вторая - прыжком назад, также возможно с переполнением.
Про название вашего ассемблера вы умолчали, если не изменяет память - у студийного была опция вроде "использовать прыжок назад для достижения дальних адресов".
tazik
Цитата(Сергей Борщ @ Sep 27 2010, 17:41) *
У меги8 порог 2Кслов, т.е. вся память доступна при помощи rjmp. Поэтому команда jmp вообще отсутствует. Одна половина памяти доступна прыжком вперед (возможно с переполнением), вторая - прыжком назад, также возможно с переполнением.
Про название вашего ассемблера вы умолчали, если не изменяет память - у студийного была опция вроде "использовать прыжок назад для достижения дальних адресов".


Спасибо, сейчас покопаю. Ассемблер атмеловский, из AvrStudio
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.