Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

ZXNet: 500:95/462.53
E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

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

(«ZX-Ревю» 7—10/1997)
Дата последнего редактирования: 26.02.2003.

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.

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

                  Пример

До преобразования:    После преобразования:

   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.

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

           Пример

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» — ассемблер сам разберётся, какие команды формировать в объектном коде.

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

Другие мои статьи об усовершенствовании ассемблера:

1. 

«Улучшение сжатия программ на ассемблере Z80». «Радиомир. Ваш компьютер» 4/2003.

Страница Ивана Рощина > Статьи >