Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Starostin_Spec_micropr_ch2_2013

.pdf
Скачиваний:
11
Добавлен:
13.04.2015
Размер:
981 Кб
Скачать
☆

31

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 – крохотная;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]