- •Лекция 23
- •Схема трансляции программы с
- •Макросы
- •Макросы
- •Примеры макросов
- •Достоинства и недостатки макросов
- •Использование макросов
- •Использование макросов
- •Использование макросов
- •Использование макросов
- •Использование макросов
- •Пример использования
- •Макродирективы
- •Директивы WHILE и REPT
- •Пример использования WHILE и REPT
- •Директива IRP
- •Директива IRPC
- •Директивы условной
- •Директивы условной компиляции
- •Директивы условной компиляции
- •Директивы IF и IFE
- •Директивы IF и IFE
- •Директивы IFDEF и IFNDEF
- •Директивы IFDEF и IFNDEF
- •Директивы IFB и IFNB
- •Директивы IFB и IFNB
- •Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
- •Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
- •Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
- •Вложенные
- •Директивы генерации ошибок
- •Безусловные директивы генерации ошибки
- •Условная генерация пользовательской ошибки
- •Условная генерация пользовательской ошибки
- •Условная генерация пользовательской ошибки
- •Пример с использованием константных выражений
Директивы генерации ошибок
Данные директивы предназначены для обнаружения различных ошибок в программе, таких как не определенные метки или пропуск обязательных параметров макроса. Директивы генерации ошибок можно разделить на два вида:
безусловные директивы, генерирующие ошибку трансляции без проверки каких-либо условий;
условные директивы, генерирующие ошибку трансляции после проверки определенных условий.
Безусловные директивы генерации ошибки
Директива ERR (.ERR) – генерирует пользовательскую ошибку
my_macro |
MACRO reg |
|
IFDIFI |
<al>, <reg> |
|
GOTO M_AL |
|
|
ELSE |
|
|
IFDIFI |
<ah>, <reg> |
GOTO M_AH ELSE
.ERR
ENDIF
ENDIF
:M_AL
…
:M_AH
…
ENDM
Условная генерация пользовательской ошибки
.ERRB (ERRIFB) <имя_формального_аргумента> - генерация пользовательской ошибки, имя <имя_формального_аргумента> пропущено;
.ERRNB (ERRIFNB) <имя_формального_аргумента> - генерация пользовательской ошибки, имя <имя_формального_аргумента> присутсвует;
cls_reg |
MACRO |
reg |
|
.ERRB <reg> |
|
|
|
|
xor |
reg, reg |
|
ENDM |
|
|
|
|
|
|
|
Условная генерация пользовательской ошибки
.ERRDEF (ERRIFDEF) символическое_имя – если указанное имя определено до момента обработки этой директивы в программе, то генерируется пользовательская ошибка.
.ERRNDEF (ERRIFNDEF) символическое_имя – если указанное имя не определено до момента обработки этой директивы в программе, то генерируется пользовательская ошибка.
.ERRDIF (ERRIFDIF) <строка_1>, <строка_2> - директива, генерирующая ошибку, если две строки посимвольно не совпадают.
.ERRIDN (ERRIFIDN) <строка_1>, <строка_2> - директива, генерирующая ошибку, если две строки посимвольно идентичны.
ERRIFDIFI – аналогично ERRIFDIF, но не различает регистра букв.
ERRIFIDNI – аналогично ERRIFIDN, но не различает регистра букв.
Условная генерация пользовательской ошибки
.ERRE (ERRIFE) константное выражение – директива вызывает ошибку, если константное выражение ложно.
.ERRNZ (ERRIF) константное выражение – директива вызывает ошибку, если константное выражение истинно (не равно нулю).
Константное выражение не может содержать компонентов, являющихся ссылками вперед.
Операторы выражения:
EQ – равно, NE – не равно, LT – меньше, LE – меньше или равно, GT – больше, GE – больше или равно, NOT - логическое отрицание, AND – логическое И, OR – логическое ИЛИ, XOR – логическое исключающее ИЛИ
Пример с использованием константных выражений
.data |
|
|
|
mas |
db |
1,2,3,4,5 |
|
len |
dd |
20 |
|
… |
|
|
|
.code |
|
|
|
… |
|
|
|
.erre |
(len – mas) LT 10 |
;Генерация ошибки, если длина |
|
|
|
|
;области mas меньше 10 байт |