А покажите, пожалуйста, пример как писать оверлейные программы с помощью macro/link?
А покажите, пожалуйста, пример как писать оверлейные программы с помощью macro/link?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Это довольно подробно описано в руководстве по вышеуказанным программам. Если нет возможности достать родные книги от ДВК - можно воспользоваться их "Достаточно Точными" копиями из комплекта БК0011/М.
Если речь идет о написании софта, заведомо не помещающегося в отведенные RT-11 ~40 кбайт пространства пользователя, тогда этот вопрос должен решаться силами пользователя - т.е. "ручками" подгружаются участки кода, что, соответственно, не прибавляет быстродействия софту, если, конечно, не используется ЭД.
Если речь идет о использовании чрезмерно длинной программы, странслированной с языка высокого уровня - к сожалению, придется так же "ручками" всё подгружать, или даже разбивать прогу на фрагменты - что, соответственно, не фонтан. Это фундаментальные ограничения 16-бит машинок, даже с ДП.
Блог : http://collectingrd.kxk.ru/ . В ЛС прошу не писать, все сообщения MMTEMA@MAIL.RU
Да, в мануалах описаны ключи ассемблера (параметры секций) и линкера (указываются какие секции оверлейные). Но живого примера я не нашёл. Ткните пожалуйста прям в ссылку и номер страницы. Или прямо вот скажем экзампл с одним main.mac, двумя ovl1.mac, ovl2.mac и скрипт для сборки мне бы очень помог.
Поскольку я не копенгаген в RT-11 и macro-11, вопросы:
1. Хэндлер оверлеев (то есть подгрузка нужных данных с диска в ОЗУ) пишется ручками? Тогда ключи компилятора и всякие поля "оверлейности" в заголовке файла -- чтобы я руками их парсил? Печаль. Мне мечталось, что этим занимается ОС. То есть я её, максимум, вежливо прошу вытеснить один оверлей другим и это всё, что я делаю руками. А скорее, создаётся некая таблица thunk'ов, где чекается в какой оверлей идёт вызов и он подгружается автоматом. И руками вообще ничего делать не надо.
2. Можно ли сделать в macro-11 такой финт, который в других ассемблерах делается директивой .org. Т.е. бинарные данные размещаются последовательно по месту (скажем по адресу "."), а всякие смещения считаются с .org addr.
то есть, например:
Должен сгенерировать объектник, который при линковке будет расположен с абсолютного адреса 1000 (или там, куда попадёт, если не было ". = nnnn"), но содержать инструкцию mov #2000, r0 (ассемблер должен думать, что он генерировал код для адреса 2000).Код:.psect .code, abs . = 1000 ; это для линкера .org 2000 ; это для ассемблера label: mov #label, r0
Как такое делается в macro-11?
3. Почему некоторые LINK.SAV для RT-11 поддерживают опцию /REL, а некоторые нет? Это задаётся на этапе генерации системы? Очень удобная штука для генерации программ для периферийного процессора УКНЦ, поскольку таблица reloc'ов пристёгивается автоматически к выходному файлу. Нет, есть, конечно, способы писать position independent code руками или, там, макросы нагородить для генерации reloc секции. Но зачем, если есть готовый инструмент.
Что первым приходит в голову - сама RT-11, виднее всего это на примере KMON'а. А так - ничего не помню. Когда-то, когда я только изучал RT-11, я на пробу написал оверлейную программку, но увы, ничего не помню, кроме того, что особо сложного ничего не было.
Помню только, что пользовался "зеленой" книжкой (РАФОС).
Последний раз редактировалось AFZ; 26.07.2016 в 12:58.
Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)
В RT-11 все довольно примитивно. В линкере перечисляются модули с ключом /O:n (/V:n для XM оверлеев), где n указывает номер сегмента в который отображается код (номера писать в порядке возрастания). Вот вобщем-то и все.
Для примера есть R.MAC - вызывает подпрограммы из оверлеев и печатает данные, переданные ими; и S(1,2,3,4).MAC которые эти данные передают...
R:S1-S4 (содержимое одинаковое, меняем только циферки):Код:.TITLE ROOT - ROOT SEGMENT .MCALL .EXIT,.PRINT ;СИСТЕМНЫЕ ВЫЗОВЫ START:: CALL SEG1 ;ВЫЗОВ СЕГМЕНТА 1 CALL SEG2 ;ВЫЗОВ СЕГМЕНТА 2 CALL SEG3 ;ВЫЗОВ СЕГМЕНТА 3 CALL SEG4 ;ВЫЗОВ СЕГМЕНТА 4 .EXIT ;ВЫХОД PSTAT:: MOV #BUFF,R0 ;АДРЕС БУФЕРА MOV #FMTS,R1 ;СТРОКА ФОРМАТА MOV #ARGS,R2 ;БЛОК АРГУМЕНТОВ MOV (R5)+,@R2 ;СОХРАНЯЕМ НОМЕР СЕГМЕНТА MOV (R5)+,2(R2) ;СОХРАНЯЕМ СТАРТОВЫЙ АДРЕС СЕГМЕНТА CALL $EDMSG ;ФОРМАТИРУЕМ CLRB @R0 ;ПРЕВРАЩАЕМ В ASCIZ .PRINT #BUFF ;ПЕЧАТАЕМ RTS R5 ;ВОЗВРАЩАЕМСЯ BUFF: .BLKB 80. ;БУФЕР ARGS: .BLKW 2 ;БЛОК АРГУМЕНТОВ FMTS: .ASCIZ /SEG %D, PC %P/ .END STARTКомпиляция:Код:.TITLE SEG1 SEG1:: JSR R5,PSTAT ;ПОДПРОГРАММА ПЕЧАТИ .WORD 1,SEG1 ;НОМЕР СЕГМЕНТА, СТАРТОВЫЙ АДРЕС RETURN ;ВОЗВРАТ .ENDПростая сборка:Код:.MAC R .MAC S1 .MAC S2 .MAC S3 .MAC S4 .Оверлейная сборка (делаем два сегмента [кроме корневого]):Код:.LIN/LINK:RSXLIB R,S1,S2,S3,S4 .RU R SEG 1, PC 001224 SEG 2, PC 001236 SEG 3, PC 001250 SEG 4, PC 001262 .Как-то так. Остальное легко понимаетсяКод:.LIN/LINK:RSXLIB R/PRO *S1/O:1 *S2/O:1 *S3/O:2 *S4/O:2 *// .RU R SEG 1, PC 003774 SEG 2, PC 003774 SEG 3, PC 004010 SEG 4, PC 004010 .
В первом случае в памяти будет примерно такая картина:Во втором - такая:Код:+--------+ | R | +--------+ | S1 | +--------+ | S2 | +--------+ | S3 | +--------+ | S4 | +--------+ | RSXLIB | +--------+Код:+--------+ | R | +--------+ | RSXLIB | +--------+ | S1/S2 | +--------+ | S3/S4 | +--------+
Последний раз редактировалось form; 26.07.2016 в 16:34.
PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
Моя принципиальная ошибка в том, что я считал, что оверлей распространяется на именованную секцию. А это оказывается модуль. То есть, если я правильно понимаю, один оверлейный сегмент не может быть разбит на несколько объектных модулей? Или может? Это, конечно, не принципиально, просто интересно.
В других системах так и есть. В RSX-11 к примеру у сборщика задач целый язык описания оверлеев есть и оперирует он секциями в том числе.
- - - Добавлено - - -
Может. Для этого нужно /O писать последнему модулю в цепочке.
На примере выше:Получили два сегмента, каждый из двух модулей. В данном случае правда смысл потерялся в виду того, что ничего не перекрывается, но как пример сойдетКод:.LIN/LINK:RSXLIB R/PRO *S1,S2/O:1 *S3,S4/O:2 *// .RU R SEG 1, PC 003760 SEG 2, PC 003772 SEG 3, PC 004006 SEG 4, PC 004020 .
Вот более интересный пример - в один сегмент два оверлея по два модуля:Код:.LIN/LINK:RSXLIB R/PRO *S1,S2/O:1 *S3,S4/O:1 *// .RU R SEG 1, PC 003760 SEG 2, PC 003772 SEG 3, PC 003760 SEG 4, PC 003772 .
Последний раз редактировалось form; 26.07.2016 в 23:12.
PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)