Здесь приведено описание файла макросов 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 |
cmovnae | cmovnc | cmovnb | cmovae |
cmovo | cmovno | cmovp | cmovnp |
cmovl | cmovnge | cmovle | cmovng |
cmovg | cmovnle | cmovge | 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: ibzh@yandex.ru
При использовании материалов, пожалуйста,
ставьте индексируемую ссылку на сайт https://ibzh.eko3.ru/
Число посетителей | |||
| Число посетителей |