ZXNet эхоконференция «code.zx»


тема: знатокам ZASM и ALASM



от: Kirill Frolov
кому: All
дата: 08 Sep 2003
Hемедленно нажми на RESET, All!

Оба ZX-ассемблера, и ZASM (версии 3.10) и ALASM (версии 4.x)
предоставляют возможность включать какую-либо часть кода в
программу по условию использования метки. В ZASM это делается
директивой IFUSED, в ALASM оператором '?' калькулятора
(пример: IF ?LABEL-1). Это даёт возможность составлять
библиотеки полезных подпрограмм и включать их в программу только
в том случае, если они в программе действительно используются.

Однако, в этом есть один подводный камень: оба ассемблера, и
ZASM, и ALASM по сути однопроходные (ZASM двухпроходный, но на
директиву IFUSED второй проход влияния не оказывает). Если
метка на первом проходе, в момент выполнения директивы условной
компиляции не считается используемой, то последующее её
использование не приведёт к включению текста с её определением.

Допустим, есть две библиотечные функции, устроенные таким
образом, что включение одной из них требует обязательного
включения другой. Пример демонстрирующий проблему:


ifused funct1
funct1
call z, funct2
ret
endif


ifused funct2
funct2
call nz, funct1
ret
endif


Получается, что если в программе используется funct2, то
требуется включение и funct1, но funct1 не будет включена,
так как до её определения нигде не используется. Можно в
библиотечном файле определение функции funct2 разместить перед
определением функции funct1 и проблема казалось-бы решена.
Hо тогда, если найдётся другая программа, явно использующая
funct1 и не использующая funct2 та-же самая проблема всплывает
опять.

Я пока приемлемого решения, кроме как облачить каждую функцию
в две директивы условной компиляции, и включать файл по
нескольку раз, до тех пор пока все метки не будут определены, не
нашёл. Выглядит это в библиотеке примерно так:


ifndef funct
ifused funct
funct
xor a
ret
endif
endif


А в основной программе так:


... текст программы ....
call funct
... текст программы ....

include "library.asm"
include "library.asm"
include "library.asm"
include "library.asm"


Сколько раз нужно включать library.asm определяется опытным
путём...

Описанная выше проблема усугубляется тем, что библиотек
больше одной и связи между ними сильно запутанные. Приходится
включать их по нескольку раз вперемешку. Мне такое решение
сильно не нравится, хочется иметь простой и универсальный способ
включить только нужные мне функции из библиотеки.

Пока писал письмо, появилась идея использовать рекурсивное
включение текста библиотеки. Hужно только дописать в конец
каждого библиотечного файла примерно такое:

ifused funct
ifndef funct
include "library.asm" ; файл включается рекурсивно
endif
endif

И так для каждой определённой в библиотеке функции. И проблемы
с перекрёстными ссылками между разными библиотеками это не
решает. :-(


Может кто предложит более рациональное решение проблемы?

от: Aleksey Senilov
кому: Kirill Frolov
дата: 09 Sep 2003
||*()*|| Привет тебе, _/Kirill/_!

08 сентября 2003 20:07, Kirill Frolov писал(а) All:

KF> Может кто предложит более рациональное решение проблемы?

Я обычно все библиотеки разделяю на две части: макросы и код. По аналогии с Си
это соответственно .h и .c
Макросы грузятся в начале программы, код библиотек в конце.

Все функции вызываются через макросы. А уж в них можно позаботиться и об
определении зависимых меток/функцией, хотя бы даже через define (или equ, или
=, если в Аласме).
Hа саму программу никаких "забот" о поддержке зависимостей не остается.

Всего наилучшего! С вами был /*Gandalf*/ *Grey*. ||*()*||

от: Kirill Frolov
кому: Aleksey Senilov
дата: 11 Sep 2003
Hемедленно нажми на RESET, Aleksey Senilov!

On Tue, 09 Sep 03 13:06:23 +0400, Aleksey Senilov wrote:

KF>> Может кто предложит более рациональное решение проблемы?
AS> Я обычно все библиотеки разделяю на две части: макросы и код.
AS> По аналогии с Си это соответственно .h и .c
AS> Макросы грузятся в начале программы, код библиотек в конце.
AS> Все функции вызываются через макросы. А уж в них можно позаботиться и об
AS> определении зависимых меток/функцией, хотя бы даже через define
AS> (или equ, или =, если в Аласме).

А как метку можно сделать используемой в ZASM? Я ничего
кроме dw label не знаю.

AS> Hа саму программу никаких "забот" о поддержке зависимостей не остается.

Агащазблин...

Для того, чтобы все ссылки были разрешены требуется, чтобы
каждая следующая используемая функция с ifdef-enif окружением
включалась в текст после использующей её функции. Это
_невозможно_ потому как есть функции с замкнутой цепочкой
зависимостей (например: funct1 использует funct2, которая
использует funct3, которая, в свою очередь использует funct1
-- предполагается, что программа может использовать любую из
functN). Да и сортировать текст библиотеки в определённом
порядке тоже неудобно...

Однозначно, что придётся заставить ассемблер просматривать
текст библиотек несколько раз до достижения нужного эффекта,
весь вопрос только в том, как это сделать.

Сейчас моя мысль остановилась на таком:
(это в конце основной программы)

rept 20
include "library1.asm"
include "library2.asm"
...
endr

Работает *ОЧЕHЬ* *медленно*. Было-бы быстрей, если бы было
известно, что неопределённых меток больше не имеется (цикл можно
бы было прервать).




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

Похожие статьи:
Amiga VS Pc" - нужно ли это?
О сетях - Структура сетей, адресация.
Software - Описание системной программмы: Professional Xoring System v1.0.
Софт - X-DOS о планах развития новой оперционной системы для Спектрума.
Голос из могилы - новое детище Клайва Синклера: Sinclair QL - Отделение фактов от вымысла.

В этот день...   24 апреля