Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №2 (Ассемблер).doc
Скачиваний:
3
Добавлен:
12.12.2019
Размер:
4.42 Mб
Скачать

Лабораторная работа № 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 ; цикл