┌──────────────────┐ │
■────────══════════─────│─────┐
┌─┐└─── NONSENSE ────────┘ │
┌───│────══════════─────│─────┘
└─┘ └───────────────────┘
ALASM 4.2 RULEZ_..
(c) PIXel
__________________________________________
В данной статье я попытаюсь объяснить
зачем нужны все те возможности которые
предоставляет упомянутый в заголовке
ассемблер, а именно макрокоманды и
команды условной трансляции. Поводом для
написания послужило полное отсутствие
интереса к вышеупомянутым фичам у местных
кодеров. В общем о пользе макросов много
написано в SCENERGY#1. Flying/DR довольно
хорошо объяснил всем зачем они нужны, но
сделал он это на примере ассемблера TASM
4.12 by XLD, а я использую ALASM_4.2.
Начну с определений:
Макрокоманда [macro, macro instruction]
Команда языка ассемблера, транслируемая в
несколько машинных команд.
Если в ващей программе одна и та же
последовательность исндтрукций ассемблера
испоьзуется несколько раз, то нет
необходимости каждый раз ее переписывать.
Гораздо удобнее оформите ее как
макроопределение и обращаться к ней
соответствующей макрокомандой. Например
часто приходится использовать такуь
последовательность команд:
ld hl,sourse
ld de,destenation
ld bc size-1
ldir
Oформим макрос:
MACRO COPY;SOURSE,DEST,SIZE
LD HL,:0
LD DE,:1
LD BC,:2-1
LDIR
ENDM
Например нам надо скопировать экран в
адрес #С000:
...
COPY #4000,#C000,#1B00
...
Само собой использовать макрос нет
необходимости если он без параметров и
состоит не только из директив ассемблера,
например:
MACRO CLS
LD HL,#4000
LD DE,#C000
LD BC,#1B00
LD (HL),L
LDIR
ENDM
Выгоднее сделать подпрограмму, но о них
чуть ниже. Такой макрос будет неэффективен
т. к. ваш код будет "жирным", но немного
быстрее чем при использовании процедур.
Использование макросов делаем текст
программы нагляднее, например:
...
PAUSE 10
BORDER 5
...
выглядит куда приятнее чем:
...
LD B,10
HALT
DJNZ $-1
LD A,5
OUT (#FE),A
...
конечно можно сделать обычные
подпрограммы, но это не будет экономней:
LD A,5
CALL BORDER
BORDER
OUT (#FE),A
RET
это изврат т. к. вызов процедуры 3 баита а
она сама 2 байта. При использовании
макросов имеем всего 2 байта.
Приведу элементарнейшие макросы:
MACRO BORDER;COLOR
LD A,:0&7
OUT (#FE),A
ENDM
MACRO PAUSE
LD B,:0
HALT
DJNZ $-1
ENDM
MACRO SETIM2;LABEL
DI
LD A,#5F
LD I,A
LD HL,:0
LD (#5FFF),HL
IM 2
EI
ENDM
MACRO TOALASM
LD BC,#7FFD
LD A,%00010100
OUT (C),A
JP #C000
ENDM
Следующий посложнее:
MACRO GETMEM;LABEL,SIZE
; label - начало нужной области
; size - размер области
IFN ? SLOWMEM
; если метка не опеделена то определим ее
SLOWMEM EQU #6000
; присвоив ей значение #6000
ENDIF
:0=SLOWMEM
; label - начало свободной области
SLOWMWM=SLOWMEM+:1
; для след. обращения (:1=size)
IFN (('(#8000-SLOWMEM))&%10000000)
; если slowmem > #8000
BORDER 2
; типо ошибка
TOALASM
; возврат домой.
ENDIF
ENDM
Данный макрос генерирует код только в
случае выхода за границу #8000. Идея
создания возникла после прочтения статьи
Flying'a в SCENERGY#1 и сделан он по
образу и подобию макроса для TASM_4.12.
Ну думаю макросостроение тепрь закипит в
нашем городишке (а может и не только в
нашем). Настоятельно рекомендую прочитать
статью на которую я неоднократно ссылался.
Как я уже говорил использовать макросы
не всегда эффективно и стоит использовать
стандартный прием, т. е. испоьзовать
процедуры. О создании библиотек процедур
говорил и Flying, но там приходится в
начале исходника указывать что мне надо, а
что нет. В ALASM'e можно избежать этого
рудимента. Допустим библиотека содержит 50
процедур и подгружается в конец исходника.
Я в своей программе использую 2 процедуры:
clrscr и clratr, значит мне надо
отассемблировать только их. Кароче
оформлять библиотеку надо так:
IF ?PROC1-1
PROC1 ....
ENDIF
IF ?PROC2-1
PROC2 ....
ENDIF
т. о. процедура PROCх будет отассемблиро-
вана лишь в случае обращения к ней из
вашего исходника.
Вот пожалуй и все, если кто чего не
понял, то думаю ему надо почитать Help к
ALASM'y 4. 2 и все будет RULEZz_. а если и
это не помогает то можно как нибудь со
мной связаться и я попытаюсь объяснить еще
разок.
Да, к стати там в приложении есть
исходники моих макросов и пример
библиотеки процедур, а так-же исходник их
всех юзающий.
__________________________________________