
Лабораторная работа № 2
Методы адресации реального режима
Содержание работы
цель работы
введение
методы адресации процессора Intel
указание методов адресации в Ассемблере Intel
порядок выполнения работы
содержание отчета
варианты заданий
заключение
Цель работы
Целью работы является изучение методов адресации реального режима, применяемых в процессорах Intel и способы их использования в языке Ассемблера.
Введение
Процессор после включения питания при условии получения тактовых импульсов занимается только одним: он выполняет команды. Если команда предполагает преобразование информации (данных), то входные и выходные данные называются операндами. Любая машинная команда, таким образом, содержит две части:
-
КОП (Код операции)
Адресная часть
Поле кода операции указывает, что будет выполняться в данной команде. Адресная часть команды определяет, где находятся операнды (входные и/или выходные) и как найти (вычислить) их адреса. Операнды могут находиться в процессоре, в памяти или в портах ввода-вывода. Способы указания (вычисления) адресов операндов называют методами адресации.
Процессоры Intel, начиная от i8086 и до современных в реальном режиме работы поддерживают т.н. сегментную организацию памяти. Суть ее состоит в формировании 20-разрядного физического адреса (т.е. для памяти до 1 Mb) в 16-разрядном процессоре, каким был i8086. Все рассматриваемые ниже способы адресации выполняются процессором с использованием 16-разрядной арифметики (АЛУ и регистров). Полученный в результате 16-разрядный эффективный адрес не является физическим адресом памяти, а попадает в блок преобразования адреса, где используются сегментные регистры. Это CS, DS, SS, ES, задающие, соответственно, адреса начала сегментов кода, данных, стека и дополнительного сегмента данных, каждый из которых является областью памяти размером 64 Кбайт. Эффективный адрес складывается с содержимым сегментного регистра, сдвинутым на 4 двоичных разряда, в результате получается 20-разрядный физический адрес.
Р
эффективный адрес
(смещение в сегменте)
сегментный адрес
(начало сегмента)
20-разрялный
физический адрес памяти
исунок 1. Вычисление 20-разрядного
физического адреса памяти
Методы адресации процессора Intel
Все методы адресации в различных процессорах сводятся к нескольким основным. Во-первых, операнд может быть указан в команде, и это называют непосредственной адресацией.
Рисунок 2. Непосредственная адресация.
Если в команде указывают адрес операнда, находящегося в памяти, то имеет место прямая адресация. Таким же способом для процессора Intel может быть указан операнд, находящийся в порте ввода/вывода, правда, порт может быть указан только от 0-го до 255-го.
Рисунок 3. Прямая адресация.
Особым случаем прямой адресации является регистровая адресация, когда операнд находится в одном из регистров процессора, а в команде указан этот регистр.
Рисунок 4. Регистровая адресация.
Если же в команде указан адрес адреса операнда (в адресном пространстве памяти или ввода/вывода), то это один из вариантов косвенной адресации. Обычно хранилищем адреса операнда является опять же один из процессорных регистров, который также указывается в команде, как и при регистровой адресации.
Рисунок 5. Косвенная адресация.
Косвенная адресация допускает следующие варианты (у Intel это многообразие возможно лишь для адресации памяти):
собственно косвенная адресация в чистом виде, называемая Intel либо индексной, либо базовой, в зависимости от того, какой регистр используется в качестве указателя адреса;
косвенная адресация со смещением, когда к содержимому регистра прибавляется указанное в команде смещение (у Intel, соответственно, индексная со смещением либо базовая со смещением);
косвенная адресация со смещением из регистра, когда адрес операнда определяется как сумма содержимого двух регистров смещение (у Intel это называется базовая индексная адресация);
косвенная адресация со смещением из регистра и из команды, в этом случае складывается содержимое двух регистров и к полученной сумме прибавляется смещение, опять же указанное в команде, Intel называет этот метод адресации как базовая индексная адресация со смещением;
косвенная адресация с автоинкрементом/автодекрементом указателя, т.е. модификацией содержимого регистра до или после использования его в качестве адреса операнда, Intel называет это цепочечными (строковыми) командами. Строковые команды будут рассмотрены в отдельной лабораторной работе. Особым случаем этого способа адресации являются операции со стеком, но здесь Intel не рискнула придумать особое название для адресации стека.
Адресация во всех методах дает адрес в сегменте данных (регистр DS), за исключением адресации через регистр BP, который указывает на смещение в сегменте стека (SS). Кроме того, в строковых операциях индексный регистр источника SI указывает на смещение в сегменте DS, а индексный регистр приемника DI указывает на смещение в сегменте ES, таким образом, строковые операнды (цепочки) адресуются парами DS:SI и ES:DI.
В любой команде, адресующей операнды в памяти, приведенную выше «привязку» к сегментам, принятую по умолчанию, можно изменить, применив перед командой префикс замены сегмента (префикс сегментного регистра).
Следует иметь в виду также тот факт, что в командах процессора Intel во многих случаях используется неявное указание операндов (скрытое в коде операции), как в памяти, так и в регистрах. Например, многие арифметические команды используют неявно аккумулятор, команды цикла – «регистр-счетчик» CX, команда 16-битного умножения помещает результат в пару регистров DX, AX и т.д.
Указание методов адресации в Ассемблере Intel
Регистровая адресация.
Если операнд находится в регистре процессора, то указание регистра называется регистровым методом адресации. Тип операнда, который может быть BYTE, WORD, DWORD, определяется размером указанного регистра.
Примеры:
mov al,ah
mov ds,ax
mov al,5 ; в аккумулятор (разряды 7..0)
; засылается байт 00000101
mov ax,5 ; в аккумулятор (разряды 15..0)
; засылается слово 00000000 00000101
mov eax,5 ; в аккумулятор (разряды 31..0)
; засылается двойное слово
; 00000000 00000000 00000000 00000101
Непосредственная адресация.
Указание операнда в команде называется непосредственной адресацией. Тип операнда, который может быть BYTE, WORD, DWORD, определяется типом приемника, кодом операции или оператором PTR.
Примеры:
mov al,5 ; в аккумулятор (разряды 7..0)
; засылается байт 00000101
mov ax,5 ; в аккумулятор (разряды 15..0)
; засылается слово 00000000 00000101
mov eax,5 ; в аккумулятор (разряды 31..0)
; засылается двойное слово
; 00000000 00000000 00000000 00000101
mov [di],byte ptr 5 ; в память
; засылается байт 00000101
mov [di],word ptr 5 ; в память
; засылается слово 00000000 00000101
mov [di],dword ptr 5 ; в память
; засылается двойное слово
; 00000000 00000000 00000000 00000101
mov dx,offset String ; String – описанная в сегменте данных область ;памяти: транслятор вычисляет смещение от начала ;сегмента до начала этой области (оператор offset) ;и помещает полученное число в команду как ;операнд (при выполнении команды это число ;загружается в регистр, а обращения к памяти не ;происходит)
Прямая адресация.
Указание адреса операнда в команде называется прямой адресацией. Программист указывает мнемоническое имя области данных, транслятор вычисляет смещение этой области в сегменте по умолчанию и помещает значение этого смещения в команду как адрес.
Примеры:
mov al,String ; String – описанная в сегменте данных область
; памяти типа BYTE: при выполнении команды ;происходит обращение к памяти по указанному ;адресу
mov al,byte ptr myData ; myData – описанная в сегменте данных область
; памяти произвольного типа
Косвенная адресация.
A. Базовая (индексная) адресация. Используются регистры BP, BX, SI, DI.
Примеры:
mov [di],al ; в память
; засылается байт
mov ax,[di] ; из памяти
; загружается слово
mov [si],byte ptr 5 ; в память
; засылается байт 00000101
mov [bx],word ptr 5 ; в память
; засылается слово 00000000 00000101
mov [si],dword ptr 5 ; в память
; засылается двойное слово
; 00000000 00000000 00000000 00000101
in al,dx ; в аккумулятор (разряды 7..0)
; загружается байт из порта, который указан в DX
; обратите внимание на синтаксис (отсутствуют [])!
; в этой команде обращение не к памяти! Регистр
; DX не может содержать адрес памяти.
B. Базовая (индексная) адресация со смещением. Используются те же регистры BP, BX, SI, DI. Принято использовать базовые регистры слева, а индексные – справа от указанного в команде смещения.
Примеры:
mov [bp+10],al ; в память
; засылается байт
mov al,buffer[di] ; из памяти загружается байт
; из массива, номер байта указан в DI
C. Базовая индексная адресация. Используются те же регистры BP, BX, SI, DI..
Примеры:
mov [bx+si],al ; в память засылается байт
mov ax,[bx][di] ; из памяти загружается слово из массива,
; адресуемого BX, адрес слова указан в DI
D. Базовая индексная адресация со смещением. Используются те же регистры BP, BX, SI, DI..
Примеры:
mov [bx+si+1],al ; в память засылается байт
mov al,2[bp][di] ; из памяти загружается байт из массива,
; номер байта указан в DI, смещение 2
mov al,[bp+2][di] ; идентичная команда
mov al,[bp+di+2] ; идентичная команда
mov al,[bp]+2[di] ; идентичная команда
mov al,[bp][di]+2 ; идентичная команда
Косвенная адресация с автоинкрементом/автодекрементом (строковые команды).
Примеры:
mov ax,ds ;
mov es,ax ; установить сегмент ES на сегмент DS
mov cx,5 ; установить счетчик
mov si,offset buffer1 ; установить указатель буфера источника
mov di,offset buffer2 ; установить указатель буфера приемника
cld ; установить флаг направления (инкремент)
m1: ;
lodsb ; загрузка байта в AL (и инкремент SI)
add al,3 ; модификация байта в аккумуляторе
stosb ; запоминание байта из AL (и инкремент DI)
loop m1 ; цикл