1874ВЕ7Т

Модераторы: ea, Alis, pip, gurzzza, _sva_

dvs
Специалист
Сообщения: 86
Зарегистрирован: 03 фев 2011, 15:03
Откуда: Воронеж
Контактная информация:

Re: 1874ВЕ7Т

Сообщение dvs »

tikhonov писал(а):При чтении файла «1874BE7T_ТехничОписание» (КФДЛ.431295.045ТО)...
.
На стр. 226. Указано, что код операции «длинный переход» «LJMP cadd» = E7, при этом длина операции – 2 байта. Т.о. длина операнда "cadd" – 1 байт, что маловато для «длинного перехода»...
.
Но на стр. 214 – про операнд «cadd» сообщается, что это "8/16/32-разрядный адрес в программном коде, указанный непосредственно (это в одном-то байте?!), или как название метки перехода."
16/32 - это уже больше похоже на "длинный переход", но...
.
Каким образом процессор, считав код операции «E7» сможет определить КОНКРЕТНУЮ длину операнда «cadd» (8/16/32) ?
.
И где я не прав?
Команда LJMP выполняет длинный переход по метке или адресу, Длина команды - 3 байта, - E7-код операции, cadd - в данной команде всегда занимает 2 байта и определяется как 16-разрядный адрес (полный).
Спасибо за сообщение, в страницу 226 ТО будут внесены исправления.
tikhonov
Сообщения: 31
Зарегистрирован: 10 июл 2015, 15:49

Re: 1874ВЕ7Т

Сообщение tikhonov »

можно-ли где-нибудь найти описание на
"К1874ВЕ96Т LINKER Version 1.13.150329",
применяемый (адаптированный?) в "CodeMaster96"
для связывания объектных модулей кода 1847ВЕ7Т
dvs
Специалист
Сообщения: 86
Зарегистрирован: 03 фев 2011, 15:03
Откуда: Воронеж
Контактная информация:

Re: 1874ВЕ7Т

Сообщение dvs »

tikhonov писал(а):можно-ли где-нибудь найти описание на
"К1874ВЕ96Т LINKER Version 1.13.150329",
применяемый (адаптированный?) в "CodeMaster96"
для связывания объектных модулей кода 1847ВЕ7Т
Все, что связано с конфигурацией линкера, описано в справке программы CodeMaster-96. Если Вы интересуетесь внутренними алгоритмами линкера, то они не могут быть предоставлены, т.к. являются авторской разработкой. Конкретизируйте, пожалуйста, вопрос.
tikhonov
Сообщения: 31
Зарегистрирован: 10 июл 2015, 15:49

Re: 1874ВЕ7Т

Сообщение tikhonov »

dvs писал(а):Команда LJMP выполняет длинный переход по метке или адресу, Длина команды - 3 байта, - E7-код операции, cadd - в данной команде всегда занимает 2 байта и определяется как 16-разрядный адрес (полный).
Спасибо за сообщение, в страницу 226 ТО будут внесены исправления.
.
Откомпилировал в "CodeMaster96" пример "Memory" для "K1847BE7T_Rev.2"...
Получил HEX-файл "Memory.hex"...
.
Разбираем исполнение ЭТОГО
- согласно п."Регистр конфигурации кристалла CCR" на стр 28 КФДЛ.
.
ССВ загружается из ячейки с адресом 2018
Смотрим HEХ-файл (разделил поля точками - для читабельности):
:02.2018.00.1F20.87
т.е. CCB = 1F ?
- Согласно стр.166 это значение означает выбор "первого горизонтального окна" в "младшем файле регистров ОЗУ"
- допустим...

Ну, - теперь пошли исполняться...
Стартовый адрес 2080 - (стр 28 КФДЛ...)
Смотрим HEХ-файл (разделил поля точками - для читабельности):
:03.2080.00.E70000.76
Т.е. по адресу "2080" во внешнее ПЗУ будет прописан код "E70000" - передать управление на адрес внутрикристального ОЗУ "0000".
А поскольку (стр 16 КФДЛ...) указано, что архитектура данного МК - "ФонНеймана" (единое адресное пространство для данных и программ)
то команда сия "посылает" процессор МК в "младший файл регистров ОЗУ" (стр 25 КФДЛ...),
где по адресу "00" в любом горизонтальном окне располагается "ZERO_REG" (стр 29 КФДЛ...)
Согласно стр 231 код "00" - это "SKIP" - или как говорили раньше "НОП - нет операции".
То есть ничего "страшного" не случиться (хотя и непонятно - зачем это).
Т.е. МК "пропустит" два первых "нулевых" байта...
А вот потом - МК загрузит "неизвестно-что" из адреса "02" - что уже неприятно...
А потом вообще перейдет к исполнению "HSI_MODE" !!!
.
- и как все ЭТО у вас работает ?!
8-(((
tikhonov
Сообщения: 31
Зарегистрирован: 10 июл 2015, 15:49

Re: 1874ВЕ7Т

Сообщение tikhonov »

dvs писал(а): Все, что связано с конфигурацией линкера, описано в справке программы CodeMaster-96. Если Вы интересуетесь внутренними алгоритмами линкера, то они не могут быть предоставлены, т.к. являются авторской разработкой. Конкретизируйте, пожалуйста, вопрос.
.
Понимаю, понимаю... "авторское" - это святое...
Но даже автору иногда-порой хочется создать нечто понятное...
- не предполагающее у пользователя выдающихся телепатических способностей
8-)
.
Конкретизирую вопрос.
- В первую очередь(пока) мне интересно описание ВЫХОДНЫХ форматов данных
(а потом будет интересно описание входных... параметры сборки, библиотеки и тд.)
.
Конкретизирую еще конкретнее.
Ну например-вот формат файла "МАР":
Раздел "OPTIONS AT START"
- описание полей (таинственных -M 10 -M 20 -M 21 и тд...)
Раздел "ADDING PROGRAMM MODULES"
- Назначение ??RESERVED_FAKE_END_MODULE
- Назначение ??RESERVED_LOCATION_MODULE
Раздел "ADDING LIBRARY MODULES"
- Назначение ??DEFAULT_CCB_MODULE
- Назначение ??DEFAULT_INT00MODULE
... и прочих модулей.
(вообще-то библиотека требует отдельного описания)
- есть-ли исходый код этих модулей и можно-ли их заменить на свои и если да - то как.
Раздел "FULL SET OF OPTIONS"
- см. пожелания к разделу "OPTIONS AT START"
Раздел "BUILDING SEGMENT" & "ADDRESS AREAS DEFINITION"
- возможные типы сегментов, их имена и цель введения оных (назначение сегментов)
- методика распределения сегментов по памяти (для данного МК). Можно-ли ее менять?
- что означает "Reserved for abs segmets" ?

Раздел "PLACING RELOCATABLE SEGMENTS"
- описать назначение полей (что значит "Border"?),
чем "Allocation: data" отличается от "Address area: DATA"
.
А если короче - то есть такая штука - как ЕСПД,
Хоть, я - и понимаю, что она во многом устарела и не полна.
Но тут (на линкер) - и этого нет...
- Хотя в "хелпе" "CMC-96 Руководство пользователя" - и осталась многобещающая ссылка
" Макроассемблер CMA-96, линкер и утилиты – Руководство пользователя."
- но она, к сожалению - не работает...
8-(
tikhonov
Сообщения: 31
Зарегистрирован: 10 июл 2015, 15:49

Re: 1874ВЕ7Т

Сообщение tikhonov »

Пример "Memory"
Исходный "Си"-код для "main":
void main()
{
var_addr = 0x23;

NT_mem->number = 0x45;
NT_mem->temp[0] = 0x10;
NT_mem->temp[5] = 0x5;

a = read_variable(0xA000);
b = 0x7FF;
write_variable(0xA000,b);
}
.
Файл "MASM Listing" , созданный в результате кросс-компиляции:
main:
;000025 void main()
;000027 var_addr = 0x23;
0000000A AD231C LDBZE _AX,#23h
0000000D C30100021C ST _AX,var_addr
;000029 NT_mem->number = 0x45;
00000012 B1451C LDB _AL,#45h
00000015 C70100401C STB _AL,4000h
;000030 NT_mem->temp[0] = 0x10;
0000001A AD101C LDBZE _AX,#10h
0000001D C30102401C ST _AX,4002h
;000031 NT_mem->temp[5] = 0x5;
00000022 AD051C LDBZE _AX,#05h
00000025 C3010C401C ST _AX,400Ch
;000033 a = read_variable(0xA000);
0000002A A30100A01C LD _AX,0A000h
0000002F C30100001C ST _AX,a
;000034 b = 0x7FF;
00000034 A1FF071C LD _AX,#07FFh
00000038 C30102001C ST _AX,b
;000021 return 0;
0000003D A01C1E LD _BX,_AX
00000040 C30100A01E ST _BX,0A000h
;000036 }
00000045 F0 RET
.ENDF
.
- как можно видеть в строке ";000021 return 0;" - имеет место быть ОШИБКА.
Судя по следующему за ней ассемблерному коду
0000003D A01C1E LD _BX,_AX
00000040 C30100A01E ST _BX,0A000h
в строке ";000021" должен стоять ДРУГОЙ "Си"-оператор: "write_variable(0xA000,b);"
.
tikhonov
Сообщения: 31
Зарегистрирован: 10 июл 2015, 15:49

Re: 1874ВЕ7Т

Сообщение tikhonov »

Пример "Memory".
Файл "Memory.map"
Раздел "ADDRESS AREAS MAP"
Address area: CODE
Segment:
*** RESERVED *** Starts at: 2000. Ends at: 2082...
.
Позвольте... Но ведь согласно КФДЛ - стартовый адрес загрузочного модуля - 2080 !
.
А согласно выходному HEX-файлу - по адресу 2080 располагается таинственная команда LJMP 0000h
То есть этот адрес в процессе сборки таки-загружается каким-то кодом,
а значит никак не может быть помечен как "RESERVED" в выходном "map"-файле сборщика.
tikhonov
Сообщения: 31
Зарегистрирован: 10 июл 2015, 15:49

Re: 1874ВЕ7Т

Сообщение tikhonov »

Согласно стр 28 КФДЛ...
по адресу 2060 располагается вектор прерывания для отладки "DEBUG"
.
Но в HEX-файле собранного демо-модуля "Memory"
по этому адресу прописан код "9с21",
причем код операции 9Сh по КФДЛ (стр 222) соответствует не команде перехода на ISR (как можно было-бы ожидать),
а команде "беззнакового деления на байт"...
8-(
dvs
Специалист
Сообщения: 86
Зарегистрирован: 03 фев 2011, 15:03
Откуда: Воронеж
Контактная информация:

Re: 1874ВЕ7Т

Сообщение dvs »

Обо всем по порядку:
1. "Смотрим HEХ-файл (разделил поля точками - для читабельности): 03.2080.00.E70000.76"
Возможно я не так объяснил, либо Вы неправильно поняли, постараюсь объяснить иначе - инструкция LJMP определяет переход в любую точку адресуемого пространства, при этом cadd определяет смещение. Сказав в одном из предыдущих сообщений, что cadd - в данной команде всегда занимает 2 байта и определяется как 16-разрядный адрес (полный), я имел ввиду, что указанное после кода E7 значение занимает два байта и определяется линкером как смещение в полном поле адресов. Таким образом запись E70000 означает нулевое смещение, т.е. переход будет выполнен на следующую команду. Команда LJMP размещена в коде программы не просто так. Приложение CodeMaster позволяет разбивать адресуемую память на сегменты. При этом код, например, стартапа можно разместить в любом другом сегменте. При использовании такой функции в инструкция LJMP осуществит переход на код стартапа.

2. "формат файла "МАР": Раздел "OPTIONS AT START"
опции описаны в "СМА-96.Руководство пользователя" в разделе "Линкер-Формат командной строки-Описание опций линкера"
Линкер имеет следующие опции:
-A Определить адресное пространство
-K Зарезервировать области в адресных пространствах с данным allocation
-N Зарезервировать области в адресном пространстве
-S Размещение сегментов
-E Определить имя выходного файла и директории назначения
-O Определить пути поиска объектных файлов
-F Задание формата выходного файла
-H Определить расширение для HEX-файла
-Z Увеличить размер сегмента
-m Генерировать MAP-файл
-M Не выводить указанные разделы в MAP-файл
Для большинства применений рекомендуется:
-M 10 # не выводить глобальные/внешние имена в программных модулях
-M 20 # не выводить глобальные/внешние имена в библиотечных модулях
-M 21 # не выводить список несвязанных библиотечных модулей
-M 60 # не выводить процесс размещения перемещаемых сегментов
-M 80 # не выводить список зарезервированных и внутренних имен
-Q Запретить выдачу предупреждения номер num
-h или -? Выдать на консоль краткое описание опций
-p, -l, -o Префиксы, изменяющие тип модуля
@filename Включить содержимое файла в командную строку
-t отключить проверку типов

Раздел "ADDING LIBRARY MODULES"
??DEFAULT_CCB_MODULE - размещает байт конфигурации кристалла CCB
Вввод значения CCB на Си: #pragma CCB <num>
на Ассемблер: ?CCB_DATA .EQU 0Eh
.PUBLIC ?CCB_DATA
Также информация представлена в разделе "Макроассемблер-Ассемблерные проекты" документа "СМА-96.Руководство пользователя"

??DEFAULT_INT00MODULE-??DEFAULT_INT18MODULE. Если проанализировать дизассемблер, станет ясно, что CM-96(CodeMaster-96) по умолчанию размещает команды зацикливания по векторам прерывания.
Данные модули переопределяются на Си: "#pragma interrupt <vec> <func_name>", где Вектор vec может принимать значения в диапазоне от 0 до 18.
на Ассемблер: .PUBLIC ?INTERRUPT09
?INTERRUPT09:
Раздел "BUILDING SEGMENT" & "ADDRESS AREAS DEFINITION"
Информация по сегментам представлена в разделах "Описание компилятора-Размещение данных и кода в памяти" документа "СМС-96.Руководство пользователя"
--чем "Allocation: data" отличается от "Address area: DATA"
Address area - адресное пространство
Allocation - атрибут сегмента, соответствующий методам доступа:
Тип памяти Атрибут 'allocation' Методы доступа
ПЗУ code выборка инструкций, чтение данных
ОЗУ data чтение и запись данных (косвенная/индексная адресация)
нижний регистровый файл reg чтение и запись данных (прямая и косвенная/индексная адресация)
tikhonov
Сообщения: 31
Зарегистрирован: 10 июл 2015, 15:49

Re: 1874ВЕ7Т

Сообщение tikhonov »

"...
инструкция LJMP определяет переход в любую точку адресуемого пространства, при этом cadd определяет смещение. Сказав в одном из предыдущих сообщений, что cadd - в данной команде всегда занимает 2 байта и определяется как 16-разрядный адрес (полный), я имел ввиду, что указанное после кода E7 значение занимает два байта и определяется линкером как смещение в полном поле адресов. Таким образом запись E70000 означает нулевое смещение, т.е. переход будет выполнен на следующую команду.
..."
.
- Спасибо! Наконец-то до меня ДОШЛО про "ОТНОСИТЕЛЬНОЕ смещение" перехода...
Ну, как говорится, - постепенно... 8-).
.
И насчет линкера - СПАСИБО.
- Все изложенное очень полезно, но-таки хорошо-бы иметь нормальное описание сей утилиты,
а не размазанное тонким слоем по различным частям "хелпа".
- ведь был-же у Вас замечательный (судя по названию нерабочей ссылки в "хелпе") документ
"Макроассемблер CMA-96, линкер и утилиты – Руководство пользователя." - или он только планировался?
Ответить

Вернуться в «Микроконтроллер 1874ВЕ7Т»