(с) Колотов Сергей, г. Шадринск, SerzhSoft, XI, 1996
ЕДИНЫЙ СТАНДАРТ ПРОГРАММИРОВАНИЯ НА АССЕМБЛЕРЕ.
В последнее время на страницах ZX-РЕВЮ все чаще и чаще можно встретить публикации, посвященные стандартизации. Наступление идет по всем фронтам: начиная от проекта ROM и заканчивая моделями компьютеров. Но пока еще не встречалось ни одной статьи, направленной на стандартизацию программирования. Предчувствуя запах тухлых яиц и гнилых овощей, уже приготовленных "свободными" кодерами и программистами для упражнений по метанию этих признаков уважения в автора данной статьи, сразу хотел бы предостеречь: остановите карающую длань! Ведь никто не заставляет именно Вас следовать нижеприведенным правилам и загонять в очень узкие рамки. Если Вы хотите ощущать полную свободу в программировании так ощущайте ее (и варитесь в собственном соку!)!
Программирование, а тем более на ассемблере, сопряжено с одной большой проблемой: программы, написанные одним, совсем необязательно будут понятны другому (в большинстве случаев это именно так!).
Даже если оба кодера и "съели в ассемблере не по одной собаке"! И это вполне естественно: один любит писать метки на русском языке английскими буквами, другой - наоборот, а третий - вообще вместо меток использует номера, ставя перед ними какую-либо букву, чтобы ассемблер это все нормально переваривал... Да и сам автор, написавший программу, через некоторое продолжительное время будет тупо смотреть на свое собственное "творение", не понимая как оно еще может работать!
Хорошо ли это? Нет, очень и очень плохо! В то время, как старина Speccy все больше и больше "загибается" от невиданного нашествия "амиг" и IBM, нужно не брести по одиночке многочисленными запутанными тропами, а "вместе весело шагать" одной проторенной дорогой, где все понимают друг-друга с полуслова. То есть предлагается "единый стандарт программирования на ассемблере", о котором далее и пойдет речь. Автор, конечно, понимает, что данная работа не закончена, и у кого-либо может вызвать протест, но главная задача этой статьи состоит не в публикации кучи непогрешимых заповедей, а предполагает возникновение диалога на страницах ZX РЕВЮ. Присылайте свои дополнения, предложения и просто высказывайте мнение, которое считаете наиболее правильным. Итак, вот некоторые пункты из моей "Библии Кодера":
1. Чем меньше в программе директив ORG - тем лучше.
2. Процедур же, наоборот, должно быть побольше.
3. В больших программах обязательно должен быть головной блок, в котором производятся вызовы рабочих процедур.
4. Чем больше в программе ком-• ментариев, тем лучше. Здесь
срабатывает принцип "Маслом каши не испортишь."
5. Все процедуры отделяются друг от друга символом ";" (точка с запятой) в отдельной строке (пустой комментарий).
6. Каждая процедура начинается с уникального имени, являющегося сокращением английских слов, характеризующих действие данной процедуры. В тех ассемблерах, где это предусмотрено, имя процедуры заканчивается символом ":" (двоеточие). В строке с именем процедуры больше не должно быть никаких команд (возможен комментарий).
7. Метки внутри процедур.
Два первых символа любой метки должны однозначно указывать на тип этой метки:
LP (LOOP) - цикл GO (GO ТО) - переход IF (IF) - переход по условию (расширение GO) ER (ERROR) - ошибка 'EX (EXIT) - выход, завершающие операции LB (LABEL) - команда, изменяемая при выполнении СН (CHANGE) - аналог LB SP,HL,DE,BC,AF,IX,IY -изменяемая команда загрузки этих регистров (или их половинок). Например:
LD (SP_GKY+1),SP
«изменение
SP.GKY LD SP.NULL изменяемая команда
Для того, чтобы сразу было однозначно ясно и понятно, что данная команда изменяется во время выполнения программы, необходимо в команде загрузки регистра указывать в качестве операнда специально опеделенную в начале программы метку NULL. Она задается так: NULL EQU 0. Ее необходимо использовать во всех изменяемых командах.
Итак, после двух символов типа в метке далеее следуют 2-3 символа (для удобства могут отделяться символом подчеркивания "_"), характеризующие принадлежность к опеделенной процедуре. Эти символы берутся из имени процедуры, обычно являясь начальными буквами английских слов (сокращений), образующих имя процедуры.
Если в процедуре несколько однотипных меток, то далее ставится номер метки: 0..9 или 00..99.
Примеры меток для проце-
дур:
CLRSCR LPCS1, GOCS04, EXCS9, LBCS... GETKEY GOGKY1, LPGKY, IF GKY и т.д.
8. Переменные, массивы, таблицы как и процедуры должны быть "говорящими" Вот часто используемые элементы, входящие в состав имен переменных, процедур: см. Listing 1. Итак, все эти сокращения (плюс сокращения для меток внутри процедур) удобно применять в программировании. Их также можно включать в имена файлов и т.д.
На этом позвольте раскланяться. Надеюсь, что читатели продолжат данное начинание и напишут отзывы о необходимости такой стандартизации программирования на ассемблере. Listing 1.
ADR (ADDRESS) CNT (COUNTER) SPD (SPEED) LVL (LEVEL) LEN (LENGTH) SZE (SIZE) HGT (HEIGHT) WDT (WIDTH) VLM (VOLUME) CHR (CHAR) TXT (TEXT) STR (STRING) SRL (SCROLL) FLD (FIELD) BRD (BORDER) PAP (PAPER) INK
ARW (ARROW) SPR (SPRITE) XR.YR (X.Y-RANGE) X,Y,Z AY
AYA.AYB.AYC IN
OUT
BUF (BUFFER)
АДРЕС СЧЕТЧИК СКОРОСТЬ УРОВЕНЬ ДЛИНА РАЗМЕР ВЫСОТА ШИРИНА ОБЬЕМ СИМВОЛ ТЕКСТ СТРОКА СКРОЛЛЕР ПОЛЕ ГРАНИЦА БУМАГА ЧЕРНИЛА СТРЕЛКА СПРАЙТ РАЗМЕРЫ КООРДИНАТЫ МУЗ. ПРОЦЕССОР КАНАЛЫ AY ВХОДНОЙ ВЫХОДНОЙ БУФЕР
BIN (BINARY) |
ДВОИЧНЫЙ |
HEX |
ШЕСТНАДЦАТЕРИЧ- |
|
НЫЙ |
DEC (DECIMAL) |
ДЕСЯТИЧНЫЙ |
BCD |
ДВОИЧНО- |
|
ДЕСЯТИЧНЫЙ |
TRB (TRURBO) |
быстрый |
POS (POSITION) |
ПОЛОЖЕНИЕ |
CR (CARRAGE) |
КАРЕТКА |
LST (LAST) |
ПОСЛЕДНИЙ |
LST (LISTING) |
ЛИСТИНГ |
DAT (DATA) |
ДАННЫЕ |
ARR (ARRAY) |
МАССИВ |
ERR (ERROR) |
ОШИБКА |
NEW |
НОВЫЙ |
MDE (MODE) |
РЕЖИМ |
FL.FLG (FLAG) |
ФЛАГ |
TBL (TABLE) |
ТАБЛИЦА |
CHN (CHANNEL) |
КАНАЛ |
NXT (NEXT) |
СЛЕДУЮЩИЙ |
LN (LINE) |
ЛИНИЯ |
STK (STACK) |
СТЕК |
MEM (MEMORY) |
ПАМЯТЬ |
BEG.BGN (BEGIN) |
НАЧАЛО |
END |
КОНЕЦ |
PTR (POINTER) |
УКАЗАТЕЛЬ |
TOP |
ВЫСОТА |
ВОТ (BOTTOM) |
ДНО |
OLD |
СТАРЫЙ |
UDG |
СИМВОЛЫ UDG |
NO,NOT |
ОТРИЦАНИЕ |
YES |
ДА |
SCR (SCREEN) |
ЭКРАН |
SHD (SHADOW) |
ТЕНЕВОЙ |
MSK (MASK) |
МАСКА |
INT (INTERRUPT) |
ПРЕРЫВАНИЕ |
PRN (PRINT) |
ПЕЧАТЬ |
GET |
взять |
PUT |
ПОЛОЖИТЬ |
KEY |
КЛАВИША, КЛЮЧ |
ON |
ВКЛЮЧЕНО |
OFF |
ВЫКЛЮЧЕНО |
SYS (SYSTEM) |
СИСТЕМНЫЙ |
USR (USER) |
ПОЛЬЗОВАТЕЛЬ |
СКИЙ |
FLE (FILE) |
ФАЙЛ |
CDE (CODE) |
коды |
OBJ (OBJECT) |
ОБЪЕКТ |
MAP |
КАРТА |
ROM |
ПЗУ |
RAM |
ОЗУ |
DRV (DRIVE) |
дисковод |
DVR (DRIVER) |
ДРАЙВЕР |
DVC (DEVICE) |
УСТРОЙСТВО |
HDR (HEADER) |
ЗАГОЛОВОК |
BCK (BACK) |
НАЗАД |
TR,TRD |
TR-DOS |
DOS UP
DN (DOWN) LF.LFT (LEFT) RG.RGH (RIGHT) FR.FIR (FIRE) CLR (CLEAR) CLR (COLOR) CLS
LO (LOW) HI (HIGH) MAX.MX MIN.MN SET
RES (RESET) VAR (VARIABLE) NUM (NUMBER) SGN (SIGN) MUS (MUSIC) SND (SOUND) FNT (FONT) CPR (COMPRESS) DCP (DECOMPRESS) CDR (CODER) DCD (DECODER) DCR (DECRUNCHER) FOR TO
SPC (SPACE) PLC (PLACE) ARC (ARCHIVE) RAR (REARCHIVATOR) FRM (FORMAT) FRM (FRAME) SCN (SCANNER) DEM (DEMO) EX,EXT (EXIT) EXT (EXTENTION) INI
WRK (WORK) TST (TEST) DGT (DIGIT)