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_. а если и
это не помогает то  можно  как  нибудь  со
мной связаться и я попытаюсь объяснить еще
разок.
  Да, к  стати  там  в   приложении   есть
исходники   моих   макросов    и    пример
библиотеки процедур, а так-же исходник  их
всех юзающий.
__________________________________________




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

Похожие статьи:
Кофейникам - включение/выключение Beeperа в Tasme
Обзор ассемблеров - Edas 3.3, Assembler for Scorpion, XAS, ZX-ASM, Alasm 2.8, Master Assembler v.1.1, TASM 4.1.
Премьера - АССЕМБЛЕРЫ, КОТОРЫЕ МЫ ВЫБИРАЕМ (описание XAS).

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