|
IzhNews
#06
29 августа 2000 |
|
Nonsense - об особенностях ассемблера Alasm 4.2 (макрокоманды,команды условной трансляции и т.д.)

┌──────────────────┐ │ ■────────══════════─────│─────┐ ┌─┐└─── 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_. а если и это не помогает то можно как нибудь со мной связаться и я попытаюсь объяснить еще разок. Да, к стати там в приложении есть исходники моих макросов и пример библиотеки процедур, а так-же исходник их всех юзающий. __________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3