- •Машинное исполнение
- •1. Просмотр памяти.
- •2. Пример машинных кодов: непосредственные данные.
- •3. Пример машинных кодов: определение данных.
- •4. Пример машинных кодов: определение размера памяти.
- •5. Специальные средства отладчика.
- •6. Сохранение программы из отладчика.
- •Ассемблирование и выполнение программы
- •1. Ввод программы
- •2. Ассемблирование программы.
- •3. Компоновка программы.
- •4. Выполнение программы.
- •5. Ввод, ассемблирование, компоновка, выполнение и анализ листинга исходной программы.
- •Определение данных
- •1. Директивы определения данных.
- •2. Определение данных с числом повторений.
- •3. Директива определения байта (dв).
- •4. Директива определения слова (dw).
- •5. Директива определения двойного слова (dd).
- •6. Директива определения поля из четырех слов (dq).
- •7. Директива определения десяти байт (dt), директива equ.
- •Программы в com-файлах
- •1. Создание exe-файла.
- •2. Получение com-файла.
- •Логика и организация программы
- •1. Команда jmp.
- •2. Команда loop.
- •3. Сегмент стека.
- •4. Программа: расширение операции пересылки.
- •5. Программа: замена строчных букв на заглавные.
- •6. Команды сдвига и циклического сдвига.
- •7. Команды логических операций: and, or, xor, test, not.
- •Xor al,bl ;Логическое сравнение
- •Команды обработки строк
- •1. Rep: префикс повторения команды.
- •2. Программа: строковые операции.
- •3. Сканирование и замена.
- •4. Дублирование образца.
- •5. Программа: выравнивание справа при выводе на экран.
- •Арифметические операции 1: обработка двоичных данных
- •1. Сложение и вычитание.
- •2. Многословное сложение.
- •3. Умножение.
- •4. Повышение эффективности умножения.
- •5. Многословное умножение.
- •6. Сдвиг регистровой пары dx:ax.
- •7. Деление.
- •8. Деление вычитанием.
- •9. Преобразование знака.
- •Арифметические операции 2: обработка данных в форматах ascii и
- •1. Сложение в ascii-формате.
- •2. Вычитание в ascii-формате.
- •3. Умножение в ascii-формате.
- •4. Деление в ascii-формате.
- •5. Двоично-десятичный формат (bcd).
- •6. Преобразование ascii-формата в двоичный формат и наоборот.
- •Обработка таблиц
- •1. Прямой табличный доступ
- •2. Табличный поиск.
- •3. Табличный поиск с использованием сравнения строк.
- •4. Транслирующая команда xlat.
- •5. Программа: вывод шестнадцатиричных и ascii-кодов.
- •6. Программа: сортировка элементов таблицы.
- •Макрокоманды
- •If (условие)
- •If (условие)
- •1. Простое макроопределение.
- •2. Использование параметров в макрокомандах.
- •3. Комментарии в макрокомандах.
- •4. Использование макрокоманд внутри макроопределения.
- •5. Директива local.
- •6. Использование библиотек макроопределений.
- •7. Конкатенация (&).
- •8. Директивы повторения: rept, irp, irpc.
- •Inc ctr ;Увеличить счетчик
- •Inc dx ;Увеличить счетчик
- •Inc dx ;Увеличить счетчик
- •9. Макрокоманды, использующие директивы if и ifndef.
- •10. Макрокоманды, использующие директиву ifidn.
- •Связь между подпрограммами
- •1. Программа: использование директив extrn и public для меток.
- •2. Программа: использование директивы public в кодовом сегменте.
- •3. Программа: общие данные в подпрограмме.
- •4. Передача параметров.
Макрокоманды
МЕТОДИЧЕСКИЕ УКАЗАНИЯ:
1. Для выполнения лабораторной работы вы должны войти в каталог группы из панели NORTON. Каждый студент должен иметь в каталоге группы свой личный каталог. Все программы должны создаваться и записываться в личном каталоге студента.
2. Для создания макрокоманды (макроса) задаются имя макроса, директива MACRO, различные ассемблерные команды, которые должен генерировать данный макрос, и для завершения макроопределения - директива ENDM. Затем в любом месте программы, где необходимо выполнение определенных в макрокоманде команд, достаточно закодировать имя макроса. В результате ассемблер сгенерирует необходимые команды.
Использование макрокоманд позволяет:
- упростить и сократить исходный текст программы;
- сделать программу более понятной;
- уменьшить число возможных ошибок кодирования;
Примерами макрокоманд могут быть операции ввода-вывода, связанные с инициализацией регистров и выполнением прерываний, преобразование ASCII двоичного форматов данных, арифметические операции над длинными полями, обработка строковых данных, деление с помощью вычитания.
3. Макроопределение должно находиться до определения сегмента. Рассмотрим пример простого макроопределения по имени INIT1, которое инициализирует сегментные регистры для ЕХЕ-программы:
INIT1 MACRO ;Начало
ASSUME CS:CSEG,DS:DSEG,SS:STACK,ES:DSEG ;
PUSH DS ;Тело
SUB AX,AX ;макро-
PUSH AX ;опре-
MOV AX,DSEG ;деле-
MOV DS,AX ;ния
MOV ES,AX ;
ENDM ;Конец
Директива MACRO указывает ассемблеру, что следующие команды до директивы ENDM являются частью макроопределения. Имя макрокоманды - INIT1, хотя здесь возможны другие правильные уникальные ассемблерные имена. Директива ENDM завершает макроопределение. Семь команд между директивами MACRO и ENDM составляют тело макроопределения.
Имена, на которые имеются ссылки в макроопределении - CSEG, DSEG и STACK - должны быть определены где-нибудь в другом месте программы. Макрокоманда INIT1 может использоваться в кодовом сегменте там, где необходимо инициализировать регистры.
4. Для того, чтобы макрокоманда была более гибкой и могла принимать любые имена сегментов можно определить эти имена как формальные параметры:
INIT2 MACRO CSNAME,DSNAME,SSNAME ;Формальные параметры
ASSUME CS:CSNAME,DS:DSNAME,SS:SSNAME,ES:DSNAME
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DSNAME
MOV DS,AX
MOV ES,AX
ENDM ;Конец макроопределения
Формальные параметры в макроопределении указывают ассемблеру на соответствие их имен любым аналогичным именам в теле макроопределения. Все три формальные параметра CSNAME,DSNAME и SSNAME встречаются в директиве ASSUME, а параметр DSNAME еще и в последующей команде MOV. Формальные параметры могут иметь любые правильные ассемблерные имена, не обязательно совпадающие с именами
в сегменте данных.
Теперь при использовании макрокоманды INIT2 необходимо указать в качестве параметров действительные имена трех сегментов в соответствующей последовательности. Например, следующая макрокоманда содержит три параметра, которые соответствуют формальным параметрам в исходном макроопределении:
М акроопределение: INIT2 MACRO CSNAME,DSNAME,SSNAME (форм. парам.)
Макрокоманда: INIT2 CSEG,DSEG,STAK (параметры)
Так как ассемблер уже определил соответствие между формальными параметрами и операторами в макроопределении, то теперь ему остается подставить параметры макрокоманды в макрорасширении:
- Параметр 1: CSEG ставится в соответствие с CSNAME в макроопределении. Ассемблер подставляет CSEG вместо CSNAME в директиве ASSUME.
- Параметр 2: DSEG ставится в соответствие с DSNAME в макроопределении. Ассемблер подставляет DSEG вместо двух DSNAME: в директиве ASSUME и в команде MOV.
- Параметр 3: STAC ставится в соответствие с SSNAME в макроопределении. Ассемблер подставляет STAC вместо SSNAME в директиве ASSUME.
5. Для пояснения назначения макроопределения в нем могут находится комментарии. Cимвол точка с запятой указывает на строку комментария, как показано в следующем макроопределении PROMPT:
PROMPT MACRO MESSGE
; Эта макрокоманда выводит сообщения на экран
MOV AH,09H
LEA DX,MESSGE
INT 21H
ENDM
Так как по умолчанию в листинг попадают только команды, генерирующие объектный код, то ассемблер не будет автоматически выдавать и комментарии, имеющиеся в макроопределении. Если необходимо, чтобы в расширении появлялись комментарии, следует использовать перед макрокомандой директиву .LALL которая кодируется вместе с лидирующей точкой:
.LALL
PROMPT MESSAG1
Макроопределение может содержать несколько комментариев, причем одни из них могут выдаваться в листинге, а другие - нет. Для подавления вывода комментария в листинг необходимо закодировать перед комментарием два символа "точка с запятой" (;;). По умолчанию в ассемблере действует директива .XALL, которая выводит в листинг только команды, генерирующие объектный код. Можно запретить появление в листинге ассемблерного кода в макрорасширениях, особенно при использовании макрокоманды в одной программе несколько раз. Для этого служит директива .SALL, которая уменьшает размер выводимого листинга, но никак не влияет на размер объектного модуля.
Директивы управления листингом .LALL, .XALL, .SALL сохраняют свое действие по всему тексту программы до тех пор, пока другая директива листинга не изменит его. Эти директивы можно размещать в программе так, чтобы в одних макрокомандах распечатывались комментарии, в других - макрорасширения, а в третьих - подавлялся вывод в листинг.
6. В некоторых макрокомандах требуется определять элементы данных или метки команд. При использовании такой макрокоманды в программе более одного раза происходит также неоднократное определение одинаковых полей данных или меток. В результате ассемблер выдаст сообщения об ошибке из-за дублирования имен.
Для обеспечения уникальности генерируемых в каждом макрорасширении имен используется директива LOCAL, которая кодируется непосредственно после директивы MACRO, даже перед комментариями. Общий формат имеет следующий вид:
LOCAL dummy-1,dummy-2,... ;Формальные параметры
7. Для многократного использования макроопределений создается библиотека макрокоманд на магнитном диске при использовании любого описательного имени, например, MACRO.LIB:
INIT MACRO CSNAME,DSNAME,SSNAME
.
.
ENDM
PROMPT MACRO MESSGE
.
.
ENDM
Теперь для использования любой из катологизированных макрокоманд вместо MACRO-определения в начале программы следует применять директиву INCLUDE:
INCLUDE C:MACRO.LIB
.
.
INIT CSEG,DATA,STAC
В этом случае ассемблер обращается к файлу MACRO.LIB (в нашем примере) на дисководе С и включает в программу оба макроопределения INIT и PROMPT. В этом примере требуется только INIT. Ассемблерный листинг будет содержать копию макроопределения, отмеченного символом С в 30 4-й 0 колонке LST-файла. Следом за макрокомандой идет ее расширение с объектным кодом и с символом плюс (+) в 31 4-й колонке.
8. Символ (&) указывает ассемблеру на сцепление (конкатенацию) текста или символов. Следующая макрокоманда MOVE генерирует команду MOVSB или MOVSW:
MOVE MACRO TAG
REP MOVS&TAG
ENDM
Теперь можно кодировать макрокоманду в виде MOVE B или MOVE W. В результате макрорасширения ассемблер сцепит параметр с командой MOVS и получит REP MOVSB или REP MOVSW.
9. Ассемблер поддерживает ряд условных директив. Каждая директива IF должна иметь спаренную с ней директиву ENDIF для завершения IF-структуры и возможную директиву ELSE для альтернативного действия: