реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> rjmp и branch is out of reach, все в пределах допустимого, а ассемблер ругается
tazik
сообщение Sep 27 2010, 06:26
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691



Почему ассемблер ругается (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 - все вполне укладывается. Более того, есть работающая программа с таким кодом.

В чем дело?
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 27 2010, 06:43
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



rjmp прыгает на плюс-минус 2 кБайт (0x7FF), а старший бит - как раз знаковый. У вас явное превышение этого порога.
Прога может работать, если переход пришелся на незапрограммированную область памяти, которую проц пройдет мимо и начнет работу с запрограммированной (или с нуля, если все забито FF до конца).
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Sep 27 2010, 06:43
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(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. Команда-то используется не только, чтобы переходить "вперед", но и "назад"...
Цитата
Более того, есть работающая программа с таким кодом.

Работающая на каком кристалле ? И для какого кристалла ругается компилятор ?
Go to the top of the page
 
+Quote Post
tazik
сообщение Sep 27 2010, 07:05
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691



Цитата(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

Прикрепленный файл  2.rar ( 4.95 килобайт ) Кол-во скачиваний: 78
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 27 2010, 09:41
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
tazik
сообщение Sep 28 2010, 01:15
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691



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


Спасибо, сейчас покопаю. Ассемблер атмеловский, из AvrStudio
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 18:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.07205 секунд с 7
ELECTRONIX ©2004-2016