Starostin_Spec_micropr_ch2_2013
.pdf31
1.Регистровая адресация
2.Непосредственная
3.Прямая
4.Косвенная регистровая
5.Базовая
6.Прямая индексная
7.Базовая индексная
Самыми быстрыми являются регистровая и непосредственная адресации, так как не требуют предварительного вычисления адреса.
Регистровая адресация
При регистровой адресации микропроцессор извлекает операнд из регистра
(или загружает его в регистр). Регистры могут быть 8 или 16-разрядные.
MOV AX, CX – копирует 16 битовое содержимое регистра счетчика CX в акку-
мулятор AX. Содержимое регистра CX не изменяется.
Непосредственная адресация
Непосредственная адресация позволяет указывать 8 или 16 битовое значение
константы в качестве операнда-источника. Эта константа содержится непосред-
ственно в команде
MOV CX, 500 |
; 500 → CX |
MOV CL, 30 |
; 30 → CL |
Примеры: |
|
MOV AL, CL |
|
MOV AL, 300 |
|
MOV AX, CL |
|
MOV AX, CX |
|
MOV AX, 1000 |
|
MOV CL, AX |
|
32
MOV 100, BX
Прямая адресация
При прямой адресации эффективный адрес ячейки памяти, содержащей дан-
ные, является составной частью команды. Микропроцессор использует этот адрес как смещение для формирования вместе с сегментным регистром данных DS 20-
битового физического адреса операнда.
Обычно прямая адресация применяется, если операндом служит переменная.
33
Например: |
MOV AX, TABLE |
; 3412h → AX |
|
|
MOV AX, TABLE+2 |
; 7856h → AX |
|
Сегмент данных |
|
||
|
|
|
|
|
|
|
|
12h |
|
TABLE |
|
|
|
|
|
34h |
|
|
|
|
|
|
|
56h |
|
TABLE+2 |
|
|
|
|
|
78h |
|
|
|
|
|
|
|
Косвенная регистровая
При косвенной регистровой адресации эффективный адрес ячейки памяти с данными содержится в базовом регистре BX, регистре указателя базы BP или ин-
дексном регистре (SI или DI). Косвенные регистровые операнды заключаются в квадратные скобки [ ], чтобы отличить их от регистровых операндов. По умолчанию сегментный адрес для регистров BX, SI, DI берется из DS, для регистра BP – из SS.
Например: MOV AX, [BX] ; 3412h → AX
Сегмент данных
BX
12h |
TABLE |
|
|
34h |
|
Для размещения эффективного адреса (смещения) в регистр ВХ:
-применяется оператор OFFSET(смещение) к адресу ячейки памяти
MOV BX, offset TABLE
-используется оператор LEA
LEA BX, TABLE
Последовательность команд
LEA BX, TABLE
MOV AX, [BX]
34
эквивалентна оператору MOV AX, TABLE.
Если нужен доступ лишь к одной ячейке памяти (в данном случае TABLE), то разумнее воспользоваться одной командой. Однако для доступа к нескольким ячей-
кам, начиная с данного базового адреса, гораздо лучше иметь исполнительный адрес в регистре. В этом случае содержимым регистра можно манипулировать, не извле-
кая каждый раз новый адрес.
Существует возможность явного указания сегментного регистра:
MOV AX, DS:[BP]
Базовая адресация
Исполнительный адрес определяется с помощью сложения значения смеще-
ния с содержимым регистров BX или BP.
Регистр BX удобно использовать при доступе к структурированным записям данных, расположенных в разных областях памяти.
Например: |
MOV AX, |
[BX]+2 ; 7856h → AX |
||||
|
|
|
|
MOV AX, |
[BX+2] |
|
|
|
|
|
MOV AX, 2[BX] |
||
|
|
|
|
Сегмент данных |
||
|
|
|
|
|
|
|
BX |
|
|
|
12h |
|
|
|
|
|
|
|
||
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
34h |
|
|
|
|
|
|
|
|
|
+2 |
|
|
|
56h |
|
|
|
|
|
|
|
|
|
|
|
|
|
78h |
|
|
|
|
|
|
|
|
|
Прямая индексная адресация При прямой индексной адресации эффективный адрес вычисляется как сумма
значений смещения и индексного регистра (DI или SI). Этот тип адресации удобен для доступа к элементам таблицы, когда смещение указывает на начало таблицы, а
индексный регистр – на ее элемент.
Например, если TABLE – таблица байтов, то последовательность команд
MOV DI, 2
35
MOV AL, TABLE[DI]
загрузит третий элемент таблицы в регистр AL.
В таблице слов соседние элементы отстоят друг от друга на два байта, поэто-
му при работе с ней надо удваивать номер элемента при вычислении значения ин-
декса. Если TABLE – таблица слов, то для загрузки в регистр АХ его третьего эле-
мента надо использовать последовательность команд
MOV DI, 4
MOV AX, TABLE[DI]
Базовая индексная адресация При базовой индексной адресации эффективный адрес вычисляется как сума
значений базового регистра (BX или BP), индексного регистра (SI или DI) и, воз-
можно, смещения.
Пример:
MOVE AX, TABLE[BX][DI];
MOVE AX, [BX+2+DI];
MOVE AX, [DI+BX+2];
MOVE AX, [BX+2][DI];
MOVE AX, [BX][DI+2];
Так как в этом режиме адресации складывается два отдельных смещения, то он удобен при адресации двумерных массивов, когда базовый регистр содержит начальный адрес массива, а значения сдвига и индексного регистра суть смещения по строке и столбцу.
36
Например, для массива TABLE размерностью 3x3:
|
|
|
|
|
|
|
Сегмент данных |
|
|
|
|
|
|
|
|
TABLE |
|
|
|
|
|
|
11 |
|
|
|
|
|
|
||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
SI |
12 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BX |
21 |
||||||
|
|
|
|
|
|
|
|
|
|
|
SI |
|
|
22 |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
|
|
|
|
|
|
|
|
BX |
31 |
||||||
|
|
|
|
|
|
|
|
|
|
|
SI |
32 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
|
|
|
|
|
|
|
MOV AL, TABLE[BX][SI]
Для перемещения по элементам этого массива BX должен изменяться с шагом от 0 до 6 с шагом 3 (перемещение по строкам), а SI – от 0 до 2 с шагом 1 (перемеще-
ние по столбцам)
Режим адресации |
Операнд |
Сегментный регистр |
|
|
|
Регистровая |
Регистр |
Не используется |
|
|
|
Непосредственная |
Константа |
Не используется |
|
|
|
Прямая |
Имя переменной + |
DS |
|
смещение |
|
|
|
|
Косвенная регистровая |
[BP] |
SS |
|
[BX] |
DS |
|
[DI] |
DS |
|
[SI] |
DS |
|
|
|
Базовая |
[BP] + смещение |
SS |
|
[BX] + смещение |
DS |
|
|
|
Прямая индексная |
[DI]+ смещение |
DS |
|
[SI] + смещение |
DS |
|
|
|
Базовая индексная |
[BP] [SI] + смещение |
SS |
|
|
|
37
|
[BP] [DI] + смещение |
SS |
|
[BX] [SI] + смещение |
DS |
|
[BX] [DI] + смещение |
DS |
|
|
|
38
Лекция 6
Псевдооператоры (директивы)
В отличие от операторов, которые с помощью транслятора переводятся в ма-
шинные коды микропроцессора, псевдооператоры (директивы) служат для управле-
ния работой транслятора и машинные коды не генерируют. С помощью псевдоопе-
раторов можно определять сегменты и процедуры, давать имена командам и элементам данных, резервировать рабочие области памяти и выполнять множе-
ство других задач.
Иидентификатор EQU
Структура:
имя EQU текст
|
Подставляет значение текст вместо идентификатора имя. |
|
|
Пример: |
|
Message1EQU |
'Сообщение$' |
|
Truth |
EQU |
1 |
var2 |
EQU |
4[SI] |
Msg |
db Message1 |
|
|
mov BL, Truth |
|
|
mov AX, var2 |
|
Внешние ссылки PUBLIC и EXTRN
PUBLIC идентификатор [, …]
Делает определенный в данном модуле идентификатор доступным другим мо-
дулям программы, которые впоследствии должны быть присоединены к этому мо-
дулю (на этапе компоновки).
EXTRN имя: тип [, …]
39
Указывает, что имя определено в другом модуле программы.
Пример:
Доступ к переменной TOTAL из другого модуля
Модуль 1
PUBLIC TOTAL
TOTAL DW 0: ; там где определена TOTAL
Модуль 2 |
|
EXTRN TOTAL: WORD |
; где используется TOTAL |
Если имя – идентификатор, определенный в сегментных данных или дополни-
тельном сегменте, то тип может быть BYTE, WORD или DWORD.
Если имя – метка процедуры, то тип может быть NEAR или FAR.
Если имя – константа, то тип должен быть ABS.
INCLUDE
Вставляет содержимое указанного файла в текущий файл исходной програм-
мы
INCLUDE имя_файла
SEGMENT
Определяет границы сегмента программы
имя_сегмента SEGMENT [выравнивание] [тип] [разрядность] [‘класс’]
выравнивание – указывает, с какого адреса может начинаться сегмент:
BYTE – с любого адреса;
WORD – с четного адреса;
DWORD – с адреса, кратного 4;
PARA (по умолчанию) – с адреса, кратного 16 (граница параграфа);
PAGE – с адреса, кратного 256.
тип – выбирает один из возможных типов комбинирования сегментов:
40
PUBLIC – все сегменты с одинаковым именем и разными классами будут объ-
единены в один, располагаясь в нем последовательно;
COMMON – все сегменты с одинаковым именем и разными классами будут объединены в один, располагаясь в нем по одному и тому же адресу;
AT – сегмент должен располагаться по фиксированному абсолютному адресу
(указываемый адрес измеряется в параграфах);
PRIVATE (по умолчанию) – сегмент не объединяется с другими.
STACK – сегмент будет использоваться в качестве стека.
разрядность – разрядность программы:
USE16 (по умолчанию) – для 16-разрядных программ (размер до 64 Кб)
USE32 – для 32-разрядных программ (размер до 4 Гб)
класс – любая метка, заключенная в одинарные кавычки. Все сегменты с одинако-
вым классом, даже сегменты типа PRIVATE, будут расположены в исполняемом файле непосредственно друг за другом.
ASSUME
Сообщает ассемблеру, с каким сегментом или группой сегментов связан тот или иной сегментный регистр.
ASSUME сегм_регистр: имя_сегм[, …]
или
ASSUME сегм_регист: NOTHING[, …]
Оператор ASSUME NOTHING отменяет действие всех предыдущих операто-
ров ASSUME для данного регистра.
Модель памяти MODEL
Описание модели памяти.
.MODEL имя_модели
имя_модели – наименование модели памяти:
TINY – крохотная;
