Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
46
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 2

Основы программирования

87

памяти содержится полный адрес подпрограммы, включающий сегмент и смещение.

;Основная программа ;Код FF IE dddd

codel segment main proc

call dword ptr subadr

main endp

Подпрограмма ;Код СВ

codcl ends

code2 segment

subr proc far

ret

subadr dd

subr endp code2 ends data segment

subr

;Двухсловная ячейка с ;адресом подпрограммы

data

ends

Процедура-подпрограмма с атрибутом far находится в другом сегмен­те команд той же программы, а ее полный двухсловный адрес — в ячейке subadr в сегменте данных. Второй байт кода команды (IE в данном приме­ре) зависит от способа адресации. Косвенный дальний вызов, как и кос­венный ближний, позволяет использовать различные способы адресации.

2.8. Макросредства ассемблера

Современные ассемблеры содержат в себе так называемые макросред­ства и по этой причине называются иногда макроассемблерами. Общая идея макросредств заключается в том, что включением в исходный текст про­граммы предложений специального языка макросредств (макроязыка) мы в какой-то степени упраачясм процессом трансляции программы. Макро­язык позволяет выполнять или не выполнять трансляцию отдельных участ­ков программы в зависимости от некоторого нами же определяемого усло­вия (условная трансляция); осуществлять размножение участка исходного текста программы, в том числе, с модификацией каждого повторения (блоки повторения); включать в программу написанные отдельно фрагменты с настройкой их текста в соответствии с заданными параметрами (макроко­манды). Объекты, создаваемые с помощью директив макроязыка, обычно называют макросами. Иногда, правда, термин макрос относят только к одному конкретному виду макросрсдств, именно, к макрокоманде. Исполь­зование макросов упрощает составление исходного текста программы и иногда делает этот текст более наглядным, хотя в отдельных случаях, как, например, в случае директив условной трансляции, наоборот, может при­вести к существе иному усложнению исходного текста.

Как и во всяком языке программирования, в языке макросредств имеется много разного рода тонкостей, но в прикладном программирова-

нии зачастую используются лишь базовые возможности этого языка. Поэтому мы ограничимся здесь рассмотрением основных макросредств ассемблера.

Блоки повторения

Блоки повторения заставляют транслятор повторить заданный блок исходного текста указанное число раз. Повторяемый блок может состоять из директив описания данных (и тогда он включается в состав сегмента данных) или из команд процессора (и тогда он описывается в программ­ном сегменте). Например, следующий фрагмент сегмента данных позволяет образовать массив, состоящий из кодов ASCII прописных русских букв:

sym=*A* ;Начальное значение временной переменной

symbols: ;Имя массива для ссылок на него

rept 32 ; Повторять столько раз

db sym ;Повторяемая директива

sym=sym+l ;Изменение переменной

endm ;Консц блока повторения

Как видно из приведенного фрагмента, блок повторения начинается с директивы ассемблера rept (от repetition, повторение), а заканчивается директивой endm (end macro, конец макроса). Реально в сегменте данных выделяется 32 байт, заполненных числами от 8Hi до 9Fh, которые пред­полагается рассматривать, как последовательность русских букв. Того же результата можно было достигнуть с помощью следующего предложения:

symbols db "А", "Б", "В", "Г", и т.д. до буквы Я или проще, хотя и менее наглядно:

symbols db 128,129,130,131, и т.д. до числа 159.

Макрос повторения несколько сокращает время, требуемое для опи­сания в тексте программы требуемого массива, хотя, возможно, снижает наглядность этого описания.

При подключении к компьютеру измерительного или управляющего оборудования иногда возникает необходимость замедлить работу процес­сора при обращении к портам этого оборудования. Замедление осуществ­ляется включением в текст программы одной или, если требуется, не­скольких команд безусловного перехода на следующее предложение:

in AL,300h ;Первое обращение к оборудованию

jmp а ;3адержка на время

a: jmp b ;вьшолнения

b: jmp с ;трех команд jmp

с: in AL,301h ;Следующее обращение к оборудованию

Для того, чтобы не создавать много ненужных, в сущности, меток, такого рода предложения часто записывают следующим образом:

in AL,300h ;Первое обращение к оборудованию jmp S+2 ;3адержка на время

88