Типы символов в стандартном массиве
May. 17th, 2019 12:09 amКаждый символ занимает в таблице одно слово. В слове три поля R, T и A:
0000 rrrr ttta aaaa
- Поле Т - 9 бит - определяет тип символа.
- Поле A - 15 бит - задаёт адрес или смещение.
- Поле R - 12 бит - ссылка на другой символ (или длинное имя). Ссылка выглядит как 04000+N. Для некоторых типов символа вместо этого поля старшая половина слова содержит четыре символа имени в кодировке Text.
Пример таблицы символов из файла madlen.dis:
UPDATE: Добавлены еще шесть типов.
Symbol table: 4001: 0000 4022 6700 0001 EXTVAR (Common 1 word) 4002: 5457 4300 4600 0002 LOC (Private 2 words) 4003: 0000 4020 6600 0003 LOCLONG (Private 3 words) 4004: 0000 4021 6300 0000 EXTFUNC 4005: 0000 0000 4007 7754 77754 4006: 0000 4004 0000 0001 EXTFUNC + 1 4007: 0000 0000 4100 0014 d14 4010: 0000 4001 0000 0005 EXTVAR + 5 4011: 0000 0000 4100 0013 d13 4012: 0000 0000 4100 0005 c5 4013: 0000 0000 4000 4567 4567 4014: 0000 4001 0000 0003 EXTVAR + 3 4015: 0000 0000 5010 0014 [EXTVAR + 3] 4016: 0000 4004 0000 0002 EXTFUNC + 2 4017: 0000 0000 5010 0016 [EXTFUNC + 2] Long names: 4020: 5457 4354 5756 4700 LOCLONG 4021: 4570 6446 6556 4300 EXTFUNC 4022: 4570 6466 4162 0000 EXTVARИсследования показали, что в объектных файлах встречаются следующие типы символов (восьмеричные значения):
- 000 - смещение от другого символа. Поле R ссылается на другой символ в таблице, поле A добавляет к нему фиксированое смещение.
- 400 - абсолютный адрес. Поле A и есть значение символа.
- 410 - перемещаемый адрес. Поле R содержит адрес, попадающий в сегмент команд или констант. При релокации этот адрес будет меняться.
- 430 - ссылка на внешнее имя, короткое. В старшей половине слова находятся четыре символа имени в кодировке Text.
- 460 - приватный блок данных, короткое имя в старшей половине. Поле A задаёт размер в словах.
- 470 - общий блок данных, короткое имя в старшей половине. Поле A задаёт размер в словах.
- 501 - косвенная ссылка. Поле A задаёт ссылку на другой символ. Содержимое памяти по этому адресу будет использовано в качестве значения (младшие 15 бит).
- 630 - ссылка на внешнее имя, длинное. Поле R ссылается на длинное имя в кодировке Text.
- 660 - приватный блок данных, поле R ссылается на длинное имя.
- 670 - общий блок данных, поле R ссылается на длинное имя.
UPDATE: Добавлены еще шесть типов.
- 001 - сложение двух символов. Поле A ссылается на первый символ, поле R на второй.
- 003 - вычитание двух символов. Поле R ссылается на первый символ, поле A на второй.
- 101 - умножение двух символов. Поле R ссылается на первый символ, поле A на второй.
- 103 - деление двух символов. Поле R ссылается на первый символ, поле A на второй.
- 520 - константа, аналогично типу 0400. Поле A определяет значение символа.
- 521 - отложенное вычисление символа. Поле A ссылается на символ, адрес которого в момент окончательной загрузки определит требуемое значение.
no subject
Date: 2019-05-18 02:30 am (UTC)no subject
Date: 2019-05-18 03:11 am (UTC)TEST: c0: 00 000 4001 atx 77777 00 000 4002 atx 77777 Symbol table: 4001: .... .... 4007 7777 77777 4002: .... .... 5207 7777 77777no subject
Date: 2019-05-18 03:54 am (UTC)Паскалю такие трюки не нужны, поэтому он никогда не делает 520, и поэтому в dtran это и не было реализовано.
no subject
Date: 2019-05-18 05:52 am (UTC)no subject
Date: 2019-05-18 06:21 am (UTC)А 521 - это типа такая рудиментарная транзитивность? Т.е. не сразу смотри в содержимое слова по адресу, а только после того, как все 501 будут определены?
no subject
Date: 2019-05-18 08:41 am (UTC)В обычном случае, когда объектные файлы линкуются в кучу, но остаются перемещаемыми, ссылки на внешние имена (типа 630 или 430) разрешаются и превращаются в перемещаемые адреса. То есть поле команды типа 7400X становится 4000Y. Символ типа 521 запрещает это делать, аж пока не начнётся настройка абсолютных адресов.
no subject
Date: 2019-05-18 04:35 pm (UTC)no subject
Date: 2019-05-18 05:54 pm (UTC)Кроме Z0x и Z1x, я не нашёл способа породить символ 521.