Сообщение от
ilynxy
А покажите, пожалуйста, пример как писать оверлейные программы с помощью macro/link?
В RT-11 все довольно примитивно. В линкере перечисляются модули с ключом /O:n (/V:n для XM оверлеев), где n указывает номер сегмента в который отображается код (номера писать в порядке возрастания). Вот вобщем-то и все.
Для примера есть R.MAC - вызывает подпрограммы из оверлеев и печатает данные, переданные ими; и S(1,2,3,4).MAC которые эти данные передают...
R:
Код:
.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
S1-S4 (содержимое одинаковое, меняем только циферки):
Код:
.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 |
+--------+