Программы, которые мы выбираем - Несколько предложений по усовершенствованию ассемблера.

ZX Review #7-8-9-10
(c) Иван Рощин, г.Москва, 1997

      Несколько предложений
по усовершенствованию ассемблера

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

2. Возможность превратить  выде-
   ленный блок текста в  коммен-
   тарий и наоборот.

                 Пример
                 ──────
   LD   A,1                 ;LD   A,1
   LD   B,2      <---->     ;LD   B,2
   CALL M1                  ;CALL M1
   CALL M2                  ;CALL M2

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

3. Когда  вы  пишете  достаточно
   большую  программу, надо  все
   время помнить, какие метки вы
   уже в ней использовали, иначе
   можно повторно определить уже
   существующую метку. Тут могла
   бы помочь такая  возможность:
   вы набираете строку с меткой,
   не задумываясь о  том, встре-
   чалась она в тексте или  нет,
   и когда курсор установлен  на
   метку, вы нажимаете некоторую
   комбинацию клавиш, и произво-
   дится проверка:  не  была  ли
   эта метка  уже  определена  в
   программе?

4. Структуризация    выделенного
   блока текста, т.е. после каж-
   дой команды передачи управле-
   ния  (JP,JR,DJNZ,RET) автома-
   тически  вставляется   пустая
   строка. Это повышает удобочи-
   таемость текста.

                 Пример
                 ──────
до преобразования:    после преобразования

L1 LD   A,(M1)        L1 LD   A,(M1)
   LD   C,A              LD   C,A
   CALL SUBR1            CALL SUBR1
   DJNZ L1               DJNZ L1
   XOR  A
   RET                   XOR  A
M1 DB   4,5,6            RET

                      M1 DB   4,5,6


5. Перевод  чисел  в  выделенном
   блоке текста из одной системы
   счисления в другую, наподобие
   того, как это сделано в  обо-
   лочке "Ревю".

                 Пример
                 ──────
до преобразования:    после преобразования

   LD   HL,#4000         LD   HL,16384
   LD   DE,#4001         LD   DE,16385
   .............         .............


6. Подсчет   байтов,  занимаемых
   участком  программы,  находя-
   щемся в выделенном блоке тек-
   ста.

                 Пример
                 ──────
   CALL M1
   LD   A,7
   LD   (HL),A
   RET
   DB   12,34

   Результат: 3+2+1+1+2=9 байт.


7. Подсчет числа тактов, за  ко-
   торое выполняются находящиеся
   в выделенном блоке текста ко-
   манды  (это бывает необходимо
   при программировании MULTICO-
   LOR'а).

                 Пример
                 ──────
   XOR  A
   LD   (HL),A
   LD   A,6
   LD   B,4

   Результат: 4+7+7+7=25 тактов.


8. Всем известна  директива  ас-
   семблера  DB, позволяющая оп-
   ределить один  или  несколько
   байтов  данных.  В  некоторых
   случаях более  удобным  может
   быть сокращенный способ запи-
   си этой директивы. Для совме-
   стимости с другими  ассембле-
   рами необходимо предусмотреть
   и   обратное   преобразование
   (всего текста или выделенного
   блока), при котором сокращен-
   ная форма записи  превратится
   в полную.

                 Пример
                 ──────
   было:

      DB   #12,#34,#56
      DB   %01110111,%11101110

   стало:

      DB   #123456
      DB   %0111011111101110


9. Можно сделать программу более
   наглядной, значительно облег-
   чить ее написание и  отладку,
   если вместо команды CP и сле-
   дующей за ней команды  услов-
   ной передачи  управления  ис-
   пользовать  намного более по-
   нятные операторы:

                 Пример
                 ──────
   было:        стало:
   .........    .........
   CP   13      IF   A=13 THEN JR M1
   JR   Z,M1    LD   A,(X)
   LD   A,(X)   IF   A<(IX+5) THEN JP M2
   CP   (IX+5)  IF   A<=E THEN JR M3
   JP   C,M2    IF   A<>(HL) THEN CALL M4
   CP   E       IF   A=0 THEN RET
   JR   C,M3    .........
   JR   Z,M3
   CP   (HL)
   CALL NZ,M4
   AND  A
   RET  Z
   .........

   Вместо IF A<(IX+5)  можно пи-
   сать  и  IF (IX+5)>A - ассем-
   блер  сам  разберется,  какие
   команды формировать в объект-
   ном коде.

   Необходимо предусмотреть воз-
   можность перекодировки  "нор-
   мальной" программы (всего те-
   кста или выделенного блока) в
   этот формат, и наоборот  (для
   совместимости  с  другими ас-
   семблерами).

           *   *   *