- •ПЕРЕЧЕНЬ СОКРАЩЕНИЙ
- •ПРЕДИСЛОВИЕ
- •Регистр флагов
- •Программа вывода строки
- •Примеры резервирования памяти
- •Регистровая адресация
- •Непосредственная адресация
- •Прямая адресация
- •Косвенная регистровая адресация
- •Адресация по базе
- •Пример программы задержки выполнения
- •Сложение, вычитание, умножение, деление
- •Рис. 15.1. Структурная схема ввода данных с клавиатуры
- •Пример программы для ввода с клавиатуры
- •Пример посимвольного ввода
- •Сортировка выбором
- •Сортировка вставками
- •Использование параметров в макрокомандах
- •Библиографический список
- •Приложение 1
- •Перечень команд
- •Приложение 2
•прямая адресация;
•косвенная регистровая адресация;
•адресация по базе;
•прямая адресация с индексированием;
•адресация по базе с индексированием.
Самые быстрые – регистровая и непосредственная адресации операндов, так как в этом случае операционный блок МП извлекает их либо из регистров, либо из конвейера команд. В других случаях адресация выполняется дольше, потому что интерфейс шины вначале должен вычислить адрес ячейки памяти, извлечь операнд и только после этого передать его операционному блоку.
Замечание. При работе с памятью следует обратить внимание на то, что старшая часть данных располагается в ячейках памяти со старшими адресами,
т. е. старший байт слова следует за младшим байтом!
Регистровая адресация
Этот способ адресации применим ко всем программно-адресуемым регистрам процессора. Операнд извлекается из регистра, например:
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
