Типы символов в стандартном массиве
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:32 am (UTC)