Слайд 2Понятие режима адресации
Команды микропроцессора оперируют данными, которые указаны в операндах команд.
Данные могут
находиться:
- в самой команде
- в регистре, который явно или неявно указан в команде
- в ячейке памяти, адрес которой явно или неявно указан в команде
Под режимом адресации будем понимать способ, который использует микропроцессор для определения месторасположения данных, которые необходимо обработать в команде
Микропроцессор автоматически определяет метод адресации по тому, как записана команда
Слайд 3Режимы адресации
Непосредственная
Регистровая
Прямая
Косвенная регистровая
Прямая по базе
Прямая с индексированием
Прямая по базе с индексированием.
Режимы
(3 -7) режимы адресации памяти.
Слайд 4Непосредственная адресация
Применяется , когда в качестве операнда команды используется константа (может использоваться
только во втором операнде команды).
В этом случае данное извлекается непосредственно из команды.
Слайд 5Пример
Mov cx, 500 ; переслать значение 500 в ; регистр cx
K equ
500; определить константу к=500
mov cx,к ; переслать значение ; константы к регистр cx
Слайд 6Особенности непосредственной адресации
Длина непосредственного операнда зависит от длины первого операнда.
mov ah, 0123h ;
ошибка
2. Если длина первого операнда превышает длину непосредственного операнда, то МП увеличивает длину непосредственного операнда до длины первого
Mov cx,500 ; сх=0000 0001 1111 0100
3. В программе на ассемблере допустимо указывать отрицательные значения
Mov cl,-30 ; cx= 0000 0000 1110 0010 в ;дополнительном коде
Слайд 7Регистровая адресация
Применяется, когда в команде указаны регистры МП.
В этом случае МП выбирает
данные из регистра или помещает данные в регистр
Mov ax,cx ; переслать ;содержимое ; регистра cx в ;регистр ax
Длина регистров должна быть одинаковой.
Mov ax,cl ; ошибка
Слайд 8Режимы адресации памяти
Применяются для выборки данных из оперативной памяти (пересылки данных в
оперативную память).
При этом способе адресации в команде ассемблера указывается исполнительный адрес месторасположения данных в памяти.
Исполнительный адрес данных определяет адрес первого байта обрабатываемых данных.
Длина обрабатываемых данных определяется записью команды.
Исполнительный адрес может быть задан:
либо в виде указателя на ячейку памяти
Сегментный адрес:смещение
либо указанием только смещения ячейки памяти. В этом случае используется сегментный адрес по умолчанию (в разных случаях – разный).
Слайд 9Прямая адресация
Применяется в том случае, когда исполнительный адрес ячейки задан непосредственно в
команде.
Основной способ - указание имени ячейки памяти и, возможно, сдвига.
В этом случае исполнительный адрес ячейки интерпретируется как смещение внутри текущего сегмента данных. Смещение нужной ячейки памяти вычисляется как сумма смещения имени внутри сегмента, в котором расположена ячейка памяти и, если задан, сдвига.
Сдвиг измеряется в байтах.
Слайд 10Пример
Field dw ? ;Определить имя field как ;ячейку памяти длиной слово в ;сегменте
Mov ax,field+3
; занести в регистр ax ; содержимое ячейки ; памяти из текущего ; сегмента данных, смещение ; которой равно смещению ; ячейки field+3 байта.
Слайд 11Пример
A dw 0001h
dw 0002h
Mov ax, a+1 ; ax=?
Mov bx, a+2 ; bx=?
Слайд 12Результат
Содержимое памяти (шестнадцатеричный вид)
01000200
A+1=0002, ax=0200
Bx=0002
Слайд 13Косвенная регистровая адресация
Применяется, когда исполнительный адрес ячейки памяти является смещением и
записан в регистрах bx, bp, si, di, или вычисляется как сумма содержимого одного из базовых (Bx, bp) и одного из индексных (si, di) регистров.
Если используется регистр bx и явно не указано иное, то считается, что ячейка памяти находится в текущем сегменте данных.
Если используется регистр bp и явно не указано иное, то считается, что ячейка памяти находится в текущем сегменте стека.
Длина ячейки памяти определяется из записи команды
Слайд 14Правила записи
Mov ax, [bx]
Занести в регистр ax содержимое ячейки памяти длиной слово
из текущего сегмента данных. Величина смещения (в байтах) находится в регистре bx.
Mov ax, [bx+si]
Mov ah, [si] ; используется ячейка памяти длиной байт
Не допускается совместное использование двух базовых и двух индексных регистров.
Слайд 15Как получить смещения?
Командой Lea
2. Операцией Offset
Field db ‘1234’ ; определение переменной в
сегменте данных и присвоение ей значения ‘1234’
Lea bx, field ; В регистр bx занести ;смещение имени field в ;текущем сегменте данных
Mov ax, [bx] ; ax=‘1234’
Слайд 16Операция offset
Mov bx, offset field ; bx=смещению field
Mov ax,0
Mov [bx], ax ;
Что сделает эта команда?
Слайд 17Прямая адресация с базированием
Применяется в том случае, если исполнительный адрес задан в
виде смещения и определяется:
Суммой содержимого базового регистра (bx,bp) и сдвига (в байтах);
Суммой содержимого базового регистра (bx,bp) и смещения ячейки памяти, заданной символическим именем;
Суммой содержимого базового регистра (bx,bp), смещения ячейки памяти, заданной символическим именем, и сдвига (в байтах);
Слайд 18Пример
Lea bx, field ; занести в bx смещение ; ячейки field
Mov bp,bx
Mov dx,
[bx+1]
Mov ax, table[bp+1] ; операция в ;сегменте данных
Mov table[bx+1], ax
Занести в ячейку памяти длиной слово и со смещением, равным сумме смещения ячейки table, содержимого регистра bx и 1 в сегменте данных, значение, содержащееся в регистре ax.
Слайд 19Прямая адресация с индексированием
Применяется в том случае, если исполнительный адрес задан в
виде смещения и определяется:
Суммой содержимого индексного регистра (si,di) и сдвига (в байтах);
Суммой содержимого индексного регистра (si,dip) и смещения ячейки памяти, заданной символическим именем;
Суммой содержимого индексного регистра (si,di), смещения ячейки памяти, заданной символическим именем, и сдвига (в байтах);
Слайд 20Пример
Lea si, field ; занести в si смещение ; ячейки field
Mov dx, [si+1]
Mov
ax, table[si+1] ;
Mov table[si+1], ax
Занести в ячейку памяти длиной слово и со смещением, равным сумме смещения ячейки table, содержимого регистра si и 1 в сегменте данных, значение, содержащееся в регистре ax.
Слайд 21Эти методы адресации удобны для доступа к последовательно расположенным ячейкам памяти (элементам
таблицы)
Table db 100 dup(0) ; Задать байтовую ; область ;памяти (таблицу) ;длиной 100 байт
mov si, 1
Mov ah,table[si] ; занести в ah первый ; байт таблицы
Mov si,2
Mov ah,table[si] ; 2 элемент
Слайд 22Прямая адресация с базированием и индексированием
Применяется в том случае, если исполнительный адрес
задан в виде смещения и определяется:
Суммой содержимого индексного регистра (si,di), базового регистра (bx,bp) и сдвига (в байтах);
Суммой содержимого индексного регистра (si,di), базового регистра (bx,bp и смещения ячейки памяти, заданной символическим именем;
Суммой содержимого индексного регистра (si,di), базового регистра (bx,bp , смещения ячейки памяти, заданной символическим именем, и сдвига (в байтах);
Слайд 23Пример
Mov dx, [bx+si+1]
Mov ax, table[si+bx] ;
Mov table[bx+si+1], ax
Mov table[bp+si+1],ax
Занести в ячейку
памяти длиной слово и со смещением, равным сумме смещения ячейки table, содержимого регистра si, содержимого регистра bx (bp) и 1 в сегменте данных, значение, содержащееся в регистре ax.
Удобно применять для доступа к элементам двумерных массивов
Слайд 24Важное замечание
Правила определения сегмента, в котором находится ячейка памяти.
Если исполнительный адрес формируется
с использованием регистра bp без использования имен ячеек памяти, то сегментный адрес ячейки памяти извлекается из регистра SS (текущий сегмент стека)
В командах обработки строк регистр di адресует текущий дополнительный сегмент (сегментный адрес извлекается из регистра es)
В остальных случаях ячейка памяти находится в текущем сегменте данных (сегментный адрес извлекается из регистра ds)
Слайд 25Явное указание сегмента
Для явного указания сегмента используется имя сегментного регистра.
Mov bp, es:[bx] ;
операция в текущем ; дополнительном ; сегменте
Mov cs:[bp], dx