Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования на Ассемблере. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
607 Кб
Скачать

прямая адресация;

косвенная регистровая адресация;

адресация по базе;

прямая адресация с индексированием;

адресация по базе с индексированием.

Самые быстрые – регистровая и непосредственная адресации операндов, так как в этом случае операционный блок МП извлекает их либо из регистров, либо из конвейера команд. В других случаях адресация выполняется дольше, потому что интерфейс шины вначале должен вычислить адрес ячейки памяти, извлечь операнд и только после этого передать его операционному блоку.

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

т. е. старший байт слова следует за младшим байтом!

Регистровая адресация

Этот способ адресации применим ко всем программно-адресуемым регистрам процессора. Операнд извлекается из регистра, например:

MOV AX,CX ; содержимое CX переписывается в АХ

INC CX ; СХ увеличивается на 1

XCHG BX,BP ; регистры BX и BP обмениваются значениями

Непосредственная адресация

Операнд (байт или слово) указывается в команде, может иметь любой смысл (число, адрес, код ASCII), а также быть представлен в виде символического обозначения, например:

MOV CX, 500 загружает 500 в СХ

MOV CL, -30 загружает значение минус 30 в регистр CL K EQU 1024 переменная К содержит значение 1024 MOV CX, K значение 1024 пересылается в CX.

Важным применением непосредственной адресации является пересылка относительных адресов (смещений). Чтобы указать, что речь

22

идет об относительном адресе данной ячейки, а не об ее содержимом, используется описатель offset (смещение):

; Сегмент данных

mes db "Урок 1' ;Строка символов ;Сегмент команд

mov DX, offset mes ;Адрес строки засылается в DX

В приведенном примере относительный адрес строки mes, т. е. расстояние в байтах первого байта этой строки от начала сегмента, в котором она находится, заносится в регистр DX.

Прямая адресация

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

;Сегмент данных

meml dw 0 ;Слово памяти содержит 0 ;Сегмент команд

inc meml ; Содержимое слова meml увеличивается на 1

mov DX, meml ; Содержимое слова с именем meml загружается в DX

Для обращения к ячейке meml мы указываем ее имя в программе. Но адрес любой ячейки состоит из двух компонентов: сегментного адреса и смещения. Обозначение meml является смещением. Сегментные же адреса хранятся в сегментных регистрах. Сегментных регистра четыре: DS, ES, CS и SS. Процессор узнает, из какого регистра взять сегментный адрес по префиксу замены сегмента. Команды процессора, обращающиеся к памяти, могут в качестве первого байта своего кода содержать префикс замены сегмента, с помощью которого процессор определяет, из какого сегментного регистра взять сегментный адрес. Для сегментного регистра ES код префикса составляет 26h, для SS – 36h, для CS – 2Eh. Если префикс отсутствует, сегментный адрес берется из регистра DS (хотя для него тоже предусмотрен свой префикс). Если в начале программы с помощью директивы assume указано соответствие сегменту данных сегментного регистра DS

23

assume DS:data

то команды обращения к памяти транслируются без какого-либо префикса, а процессор при выполнении этих команд берет сегментный адрес из регистра DS.

Если в директиве assume указано соответствие сегмента данных регистру ES

assume ES:data

то команды обращения к полям этого сегмента транслируются с добавлением префикса замены для сегмента ES. При этом предложения программы выглядят обычным образом; в них по -прежнему просто указываются имена полей данных, к которым производится обращение.

Однако в ряде случаев префикс замены сегмента должен указываться в программе в явной форме. Если в сегменте команд содержится поле данных с именем mem, то команда чтения из этого поля будет выглядеть следующим образом:

mov AX,CS:mem

В этом случае транслятор включит в код ком анды префикс замены для сегмента CS.

Команда (неправильная) mov 6,10

должна была бы переслать число 10 в число 6, что, разумеется, лишено смысла и выполнено быть не может. Команда же

mov DS:6,10

пересылает число 10 по относительному адресу 6, что имеет смысл. Таким образом, обозначение сегментного регистра с двоеточием перед операндом говорит о том, что операнд является адресом.

Обязательно указывать регистр:

– для сегментных регистров ES,CS,SS inc es:mem

– при обращении к памяти по известному АБСОЛЮТНОМУ адресу mov al,ds:17h

mov bx,es:2ch

24

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