Файл макросов общего назначения

Здесь приведено описание файла макросов commonib.inc, а также некоторые соглашения об именах, которые я использовал в своих программах.

Часто используемые константы

     Yes       equ  1         ; Да
     No        equ  0         ; Нет
     null      equ  0         ; символ Null
     nill      equ  -1        ; символ Nill
     variable  equ  0         ; Означает в ряде наборов макросов переменный размер
     CR        equ  0ah, 0dh  ; Возврат каретки
     MsgEnd    equ  CR, '$'   ; Конец сообщения ДОС
     Bell      equ  7h        ; Символ гудка в ДОСе

Макросы, предназначенные для использования в макросах

Следующие макросы проверяют, является ли входной параметр input именем регистра ЦП. Макросы возвращают переменную output=Yes, если является именем регистра. В противном случае, переменной output присваивается значение No.

    IsItReg?d      input, output   ; Регистр размером в двойное слово
    IsItReg?w      input, output   ; Регистр размером в слово
    IsItReg?b      input, output   ; Регистр размером в байт
    IsItReg?       input, output   ; Это вообще регистр?

Макрос IsItReg? возвращает в output в качестве ответа размер регистра в байтах (1 — байтовый, 2 — словный, 4 — двухсловный регистр, 0 — input не является регистром).

Если параметр reg не является регистром, то ниже следующие макросы выдавает сообщение об ошибке: «Параметр макроса должен быть именем ...-битного регистра».

    ErrIfNotDReg   reg        ; Ошибка, если reg не регистр размером в двойное слово
    ErrIfNotWReg   reg        ; Ошибка, если reg не регистр размером в слово
    ErrIfNotbReg   reg        ; Ошибка, если reg не регистр размером в байт
    ErrIfNotReg    reg        ; Ошибка, если reg не регистр

Макрос переносит значение, регистр или переменную var в регистр reg только в том случае, если var и reg различаются. Является ли reg именем регистра, не проверяется. Смысл использования этого макроса в состоит в том, чтобы не генерировался код вида mov cx, cx. (У меня такое случилось, когда я использовал макросы, входившие в состав пакета TASM.)

    movreg         reg, var

Макросы, предназначенные для использования в программах (и макросах)

Следующие макросы создают максимально короткий код, для помещения в регистры некоторых часто используемых констант. Входной параметр reg — регистр или память.

    movnill        reg        ; Помещает константу nill (-1)
    movnull        reg        ; Помещает константу null (0)
    movone         reg        ; Помещает константу 1

Следующие макросы выполняют операцию reg:=max(reg, par1, par2, par3). reg — имя регистра; par1, par2, par3 — переменные в памяти, регистры или константы. Любой из них может быть пустым.

    setmax         reg, par1, par2, par3  ; Наибольшее беззнаковое число
    isetmax        reg, par1, par2, par3  ; Наибольшее число со знаком

Следующие макросы выполняют операцию reg:=min(reg, par1, par2, par3).

    setmin         reg, par1, par2, par3  ; Наименьшее беззнаковое число
    isetmin        reg, par1, par2, par3  ; Наименьшее число со знаком

Далее идёт макрос, копирующий в памяти строку заданного размера. Назначение регистров esi — источник; ;edi — приёмник; df — направление переноса, как во всех командах копирования строк SizeBytes — константа, число байт, которое нужно переместить. Если параметр save_ecx пустой, и длина SizeBytes больше 27 байт, ecx портится. Если save_ecx не пуст, то при длине больше 27 байт, ecx сохраняется в стеке. При длине меньше 28 байт, ecx не используется. После выполнения макроса esi и edi указывают на байт, следующий за скопированной строкой, как при использовании команд movsd, movsw, movsb (вообще-то они и используются).

    movstr         SizeBytes, save_ecx

Следующие макросы перемещают байт, слово или двойное слово в памяти через eax (adr1:=adr2). adr1 — адрес приёмника; adr2 — адрес источника. Для movmax нужно указать s — размер перемещаемых операндов (byte, word или dword). После исполнения al (ax или eax содержит adr2

    moval          adr1, adr2             ; Перемещает байт через al
    movax          adr1, adr2             ; Перемещает слово через ax
    moveax         adr1, adr2             ; Перемещает двойное слово через еax
    movmax         adr1, adr2, s          ; Перемещает 1, 2 или 4 байта, в зависимости
                                          ; от параметра s (byte, word или dword)

Следующий макрос перемещает двойное слово в памяти через стек. adr1 — адрес приёмника; adr2 — адрес источника.

    movmst         adr1, adr2

Следующие макросы выполняют обмен двух байт, слов или двойных слов в памяти через регистр eax. adr1, adr2 — адреса операндов s — размер перемещаемых операндов (byte/word/dword). После выхода из макроса регистр al, ax или eax содержит то же, что и adr1

    xchgmax        adr1, adr2, s
    xchgal         adr1, adr2
    xchgax         adr1, adr2
    xchgeax        adr1, adr2

Следующий макрос обменивает двойные слова через стек.

    xchgmst        adr1, adr2

Следующие макросы позволяют «использовать» команды условной пересылки данных новых моделей процессоров, на процессарах 386, 486 и первых пентиумах. Если нужно создать код для работы на процессорах P6+, то следует перед включением файла commonib.inc как-нибудь определить переменную CPU686. Например,

  CPU686 = 1
  include commonib.inc

Мнемоники команд приведены ниже

cmovz cmove cmovnz cmovne
cmovs cmovns cmovc cmovb
cmovnaecmovnc cmovnb cmovae
cmovo cmovno cmovp cmovnp
cmovl cmovngecmovle cmovng
cmovg cmovnlecmovge cmovnl
cmovbe cmovna cmova cmovnbe

Условия исполнения те же, что и в командах перехода.

Соглашения об именах

В своих опытах с ассемблером автор старался (с переменным успехом) упорядочить именование переменных в программах, с целью, с одной стороны, обеспечить уникальность имён в разных файлах макросов, а с другой — максимально сократить длину имени и при этом обеспечить его читаемость и максимальную информативность. Для этого выработан ряд правил, по которым образуются имена. Эти правила изложены ниже и не распространяются на макросы, описанные в файле common.inc.

Имена переменных, констант и т. п. имеют следующую структуру:


XxxYZZZZZZZZZZZ


где X — определяет тип данных или объекта (одна или несколько буква из приведённых ниже)
x — уточнение, необязательно и содержит не более двух символов
Y — принадлежность к тому или иному модулю или файлу (один или несколько символов).
Z — имя перемнной.

Буква X может принимать одно из следующих значений


P(ointer) указатель (дальний или ближний);
B(ase) базовый адрес;
J(ump) указатель адреса исполняемого кода, по которому производится переход;
Jr(Jump Return) указатель, по которому осуществляется вызов процедуры;
E(xecute) исполняемый код (макросы);
N(Initialization) макрос не содержит исполняемого кода и используется только для настройки;
G(again) метки циклов;
X(exit) метка выхода из процедуры (подпрограммы);
Xg прерывание цикла;
K(Skip) метка, переход по которой указывает на пропуск части кода;
Kw(Skip switch) метка, переход по которой указывает ветвление;
W(switch) переменные, определяющие точку перехода, которая может меняться в процессе выполнения алгоритма (но не адрес, для этого используется приставка J), а также состояние устройства. (переключатель);
U(count) счётчик, например цикла, (переменная);
I(ndex) индекс в таблице (массиве), номер элемента; после I может следовать число, указывающее с какого номера ведётся отсчёт (обычно 1), если число не указано, то подразумевается, что с нуля.
O(ffset) смещение относительно другого адреса (байт/бит);
Q(equipment) номер порта (оборудование);
S(ize) размер, в памяти (байт);
L(ength) длина в произвольных единицах, общее количество элементов;
F(lag(s)) флаг(номер бита) или байт (слово, двойное слово) флагов;
M(ask) маска;
A(rray) начало массива (таблицы) однородных элементов;
T(ext) текстовая строка (оканчивающаяся NULL, '$', содержащая размер и т. п.);
C(onstant) константа;
R(ecord) описания структур или структуры в памяти (запись);
V(ariable) остальные переменные (какие-либо данные);
D(Identification) переменная или константа, используемая для идентификации типа данных;

Вместо X также могут использоваться следующие приставки (в скобках однобуквенные эквиваленты):


Count счётчик (U);
Rep метка цикла (G);
Skip метка пропуска части кода, если между ссылкой и меткой в коде нет сылок, на код, выходщий за метку Skip (K);
ExOk метка, за которой следует код выхода из процедуры (X);
ExCode метка, за которой следует код выхода из процедуры и код (число) завершения процедуры (X);
ExErr метка, за которой следует код выхода из процедуры с ошибкой, может следовать номер ошибки (X);
Msg сообщение, выводимое на экран (T);
ID идентификатор (D);

Дополнительные уточнения 'x' могут принимать те же однобуквенные значения, что и 'X'. Например, выражение Pam... будет читаться как Указатель(P) на таблицу/массив(a) масок(m).

Если имя предназначено для использования только внутри данного файла, то ему должен предшестовать символ подчёркивания «_» или точка «.».

Ниже приведены соглашения о приставках к именам, даваемым в программах и отдельных модулях переменным, меткам и именам процедур, названиям констант. Эти соглашения не являются обязательными для имён, объявленных в макросах или процедурах локальными, и к их входным и выходным параметрам, т. к. нигде вне макроса они не используются и их как правило относительно не много.

Для параметров макросов и локальных имён макросов (которые идут после директивы local) имя имеет вид: XxxZZZZZ или Zzzzzzz. Смысла уточнять имя модуля или файла нет, т. к. оно и так локализуется внутри файла. Локальные метки процедур начинаются с символов "@@" (соглашение TASM) и, поскольку они локализуюся в переделах директив proc...endp, прификса модуля Y также не содержат. Если в макросе или процедуре метка данного вида одна, то её имя может опускаться, т. е. просто указываться тип Xxx или @@Xxx.


Примеры составных префиксов:


Qe порт, в который посылается команда периферийному устройству;
Qi Индексный порт;
Qv Порт данных;
Qf Порт, содержащий флаги устройства, задающие, например, режимы работы;
Ceq команда внешнего устройства, посылаемая в порт;
Aj таблица переходов;
Paj указатель на таблицу переходов;
Af битовый массив;
Pa указатель на таблицу;
Ap таблица указателей;
Dt Иденртификатор строки (например, типа);
Td Строка-идентификатор;

В именах (буквы ZZZZ) могут приниматься сокращения:


Rd(read) Чтение (читать);
Wr(write) Запись (записать);
Wt(wait) Ждать;
Reg(register) Регистр;
Chk(check) Проверка.

©   Жуков И. Б.

e-mail:

При использовании материалов, пожалуйста,

ставьте индексируемую ссылку на сайт https://ibzh.eko3.ru/





Число посетителей


Яндекс.Метрика

Число посетителей