ZX-Ревю 1995 №1 1994 г.

Профессиональный подход - Определение базового адреса релоцируемой программы.


ПРОФЕССИОНАЛЬНЫЙ ПОДХОД

Когда-то мы, как бы невзначай, подкинули читателям идею переделки програмпы MEMORY EDITOR для обеспечения ее релоцируемости. Мы и сами не ожидали, что эта мысль вызовет целую лавину писем (некоторые из них были опубликованы), после чего посчитали, что тема эта исчерпана. Оказалось - нет! Творческая мысль не зациклилась на конкретной программе, а расправив могучие крылья, взлетела ввысь. Предлагаем сегодня вниманию наших читателей две работы на тему перемещаемости программ.

Первая - ориентирована на соз

Определение базового адреса релоцируемой программы

(С) Сергей Рюмик,

г.Чернигов-34, 1995.

Хочу поделиться своими исследованиями .

Возможно, кому-то это уменьшит на пару байтов головную боль. В ZX-РЕВЮ неоднократно приводился прием для определения базового адреса релоцируемых (перемещаемых) программ. Он заключается в следующем:

CD 7С 00 CALL #007С

ЗВ DEC SP

ЗВ DEC SP

El POP HL

Подпрограмма #007С содержит один RET, после чего отложенное значение базового адреса снимается со стека в регистр HL.

Этот прием широко применялся еще в знаменитом пакете процедур SUPERCODE (CP Software, 1983).

Однако, если бы в ПЗУ "Спект-рума" нашлась последовательность байтов:

ADR El POP HL

Е9 JP (HL)

то для определения базового адреса можно было бы обойтись всего тремя байтами: CALL ADR. Действидание несложных кодовых блоков, не требующих составления таблицы адресов. Цель - определение базового адреса, который определяет адрес загрузки и старца кодового блока.

Вторая - предназначена тем, кто разрабатывает более сложные программы, в которых одним базовым адресом не обойтись - нужна адресная таблица.

Авторы этих материалов сделали мощный прорыв в создании релоци-руемых программ. С удовольствием предлагаем читателям эти замечательные работы.

тельно, в этом случае по команде POP HL в регистровую пару HL запишется адрес возврата, то есть базовый адрес, а затем на него же и передастся управление по команде безусловного перехода DP (HL).

После просмотра ПЗУ "Спектрум 48м была обнаружена искомая область :

#1FC3 CD 30 25 CALL #2530 #1FC6 El POP HL

#1FC7 C8 RET Z

#1FC8 E9 DP (HL)

Подпрограмма #2530 содержит проверку BIT 7,(IY+1).

Ложку дегтя в стройную систему подбросила команда RET Z, так некстати вклинившаяся между POP HL и OP (HL). За это для гарантированного определения базового адреса придется заплатить двумя лишними байтами, однозначно сбрасывающими флаг Z.

Итого: 5 байтов в процедуре. А можно ли еще меньше? Можно, что и показано в таблице (см. на следующей странице).

Примечания к таблице.

1. Для точки входа #1FC5 первый байт интерпретируется как команда DEC Н.

2. Для процедуры 3 при запуске из Бейсика содержимое аккумулятора А изменяется в зависимости от адреса запуска.

3. Для процедуры 4 при запуске из Бейсика в ячейке (IY+1) - это переменная FLAGS 23611 (#5СЗВ) -бит 7 при выполнении программы всегда установлен в "Iй.

ПРОФЕССИОНАЛЬНЫЙ ПОДХОД

N

Процедура определения базового адреса

Длина

Базовый адрес

Используемые регистры

Ограничения

1

ADR CD7C00 CALL #007С ЗВ DEC SP ЗВ DEC SP El POP HL

6

байтов

HL=ADR+3

HL

нет

2

ADR 2600 LD H.#00 CDC51F CALL #1FC5 или

ADR AF XOR A 3D DEC A CDC61F CALL #1FC6

5

байтов 5

байтов

HL-ADR+5 HL=ADR+5

HL A, HL

нет нет

3

ADR 3D DEC A

CDC61F CALL #1FC6 или

ADR 3C INC A

CDC61F CALL #1FC6

4

байта 4

байта

HL»ADR+4 HL=ADR+4

A, HL A, HL

А<>#01 AO#FF

4

ADR CDC31F CALL #1FC3 или

ADR CDC51F CALL #1FC5

3 байта 3 байта

HL=ADR+3 HL=ADR+3

HL, IY HL

BIT 7,

(IY+1)>0 Н<>#01

5

ADR C5 PUSH ВС El POP HL или

ADR 60 LD H,B 69 LD L,C

2

байта 2

байта

HL-ADR HL=ADR

ВС, HL ВС, HL

При запуске из Бейсика.

6

ADR при запуске кодовых программ из Бейсика в регистровой паре ВС передается адрес запуска

BC=ADR

ВС

При запуске из Бейсика.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
ZX Club - заметка по игре Звездное Наследие.
Inferno - Письма в редакцию.
Каталог - коллекция программного обеспечения для ZX Spectrum от группы MSD.

В этот день...   14 октября