Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Косвенный способ адресации ассемблер

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

Краткие теоретические сведения к лабораторной работы № 2

Косвенная адресация.Слово «косвенный» означает, что в самой команде может находиться лишь часть эффективного адреса, а остальные его компоненты находятся в регистрах. Используются следующие типы косвенной адресации:

Косвенная регистровая адресация.

При такой адресации эффективный адрес операнда может находиться в любом из регистров общего назначения, кроме sp/esp и bp/ebp. Синтаксически в команде указывается регистр в квадратных скобках [ ], в котором находится адрес операнда. К примеру, команда mov ax,[bx] помещает в регистр ax содержимое слова по адресу из сегмента данных со смещение, хранящимся в регистре bx. Так как содержимое регистра легко изменить в ходе работы программы, данный способ адресации позволяет динамически назначить адрес операнда для некоторой машинной команды. Это свойство очень полезно, например, для организации циклических вычислений и для работы с различными структурами данных типа таблиц или массивов.

Косвенная регистровая адресация со смещением

Этот вид адресации является дополнением предыдущего и предназначен для доступа к данным с известным смещением относительно некоторого базового адреса. Этот вид адресации удобно использовать для доступа к элементам структур данных, когда смещение элементов известно заранее, на стадии разработки программы, а базовый (начальный) адрес структуры должен вычисляться динамически, на стадии выполнения программы. Модификация содержимого базового регистра позволяет обратиться к одноименным элементам различных экземпляров однотипных структур данных. К примеру, команда mov ax,[bx+3] пересылает в регистр ax слова из области памяти по адресу: содержимое bx+3. Эта команда пересылает в регистр ax слово, записанное в ячейку памяти, адрес которого определяется суммой содержимого bx и 3.

Косвенная индексная адресация со смещением.

Этот вид адресации очень похож на косвенную регистровую адресацию со смещением. Здесь также для формирования эффективного адреса используется один из регистров общего назначения. Но индексная адресация обладает одной интересной особенностью, которая очень удобна для работы с массивами. Она связана с возможностью так называемого масштабирования содержимого индексного регистра. Это относится к байту sib команды. Этот байт состоит из трех полей, одно из которых – поле масштаба ss, на значение которого умножается содержимое индексного регистра. К примеру, в команде mov ax,mas[si*2] значение эффективного адреса второго операнда вычисляется выражением mas+ (si)*2. В связи с тем, что в ассемблере нет средств для организации индексации массивов, то программисту своими силами приходится ее организовывать. Наличие возможности масштабирования существенно помогает в решении этой проблемы.

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

При этом виде адресации эффективный адрес формируется как сумма содержимого двух регистров общего назначения: базового и индексного. В качестве этих регистров могут применяться любые регистры общего назначения, при этом часто используется масштабирования содержимого индексного регистра. Например: mov ax,[bx][si]. В данном примере эффективный адрес второго операнда формируется суммой содержимого двух указанных регистров.

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

Этот вид адресации является дополнением косвенной индексной адресации. Эффективный адрес формируется как сумма трех составляющих: содержимого базового регистра, содержимого индексного регистра и значения поля смещения в команде. Команда mov ax,mas[bx][si] производит пересылку слова в регистр ax, адрес которого равна сумме трех составляющих: начального адреса массива mas, содержимого регистров bx и si.

Краткие теоретические сведения к лабораторной работы № 3.

Читать еще:  Адресация tcp ip

Под адресацией данных на языке Ассемблера подразумевается способы описания соответствующих адресов хранения операндов, используемых в программе. Существуют следующие основные способы описания операндов:

Для данного правила есть исключения, которые касаются:

— команд работы с цепочками, которые могут перемещать данные из памяти в память;

— команд работы со стеком, которые могут переносить данные из памяти в стек, также находящийся в памяти;

— команд типа умножения, которые кроме операнда, указанного в команде, используют еще м второй, неявный операнд.

Непосредственная адресация. В качестве операнда-источника данных (байты, слова, двойные слова) можно использовать константу, непосредственно записанную в команде МП. Если при записи команды используется константа меньшей размерности, чем приемник, то эта константа будет автоматически увеличина (с учетом знака) до нужной величины. MOV AX,327

Прямая адресация.При прямой адресации в команде указывается то смещение, которое соответствует началу размещения в памяти соответствующего операнда. Прямая адресация используется в тех случаях, когда явно известен адрес операнда. Ее можно использовать при работе с системными областями памяти. По умолчанию считается, что все операнды находятся в сегменте данных, поэтому при вычислении адреса используется текущее содержимое регистра DS. При использовании прямой адресации можно переопределять сегмент: MOV TEMP, DL;

содержимое регистра DL пересылается в ячейку памяти с именем TEMP.

Регистровая адресация.В качестве операндов (приемников, источников) можно использовать внутренние регистры МП: 8-разрядные регистры данных AH, AL,BH, BL, CH, CL, DH, DL, 16- разрядные регистры данных и индексные регистры АХ, ВХ, СХ, DX, SP, ВР, SI, DI, а для МП Intel 8086 и старше – 32- разрядные регистры данных и индексные регистры ЕАХ, ЕВХ, ЕСХ, ЕDX, ЕSP, ЕВР, ЕSI, ЕDI. Кроме того, можно использовать сегментные регистры СS, DS, SS, ES, а для МП Intel 8086 и старше – FS, GS.

Статьи к прочтению:

Котел двухконтурный и бойлер косвенный.

Похожие статьи:

Базовый МК семейства Intel 8051 включает следующие основные устройства: ЦПУ (АЛУ, А, регистры и т.п.); Резидентная память программ , мин. — 4Кбайт;…

Структура и функционирование Общая структура микроконтроллера MC68HC908GP32 Микроконтроллер MC68HC908GP32 содержит 8-разрядный процессор CPU08,…

Режимы адресации и форматы машинных команд

Микропроцессор Intel предоставляет множество способов доступа к операндам. Операнды могут содержаться в регистрах, самих командах, в памяти или в портах ввода-вывод. Режимы адресации разделяются на семь групп:

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

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

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

4. Косвенная регистровая адресация.

5. Адресация по базе.

6. Прямая адресация с индексированием.

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

Микропроцессор выбирает режим адресации по значению поля режима команды. Ассемблер присваивает то или иное значение полю режима в зависимости от того, какой вид имеют операнды в исходной программе. Например, если есть команда

То ассемблер закодирует оба операнда (AX, BX) для регистровой адресации. Если же поместить регистр BX в квадратные скобки:

То Ассемблер закодирует операнд-источник для косвенной регистровой адресации.

В табл. 1 приведены форматы операндов языка ассемблер и указан какой из регистров сегмента используется для вычисления физического адреса.

Режим адресацииФормат операндаРегистр сегмента
РегистровыйРегистрНе используется
НепосредственныйДанноеНе используется
ПрямойМетка СдвигDS DS
Косвенный регистровый[BX] [BP] [DI] [SI]DS SS DS DS
По базе[BX]+сдвиг [BP]+сдвигDS CS
Прямой с индексированием[DI]+сдвиг [SI]+сдвигDS DS
По базе с индексированием[BX][SI]+сдвиг [BX][DI]+сдвиг [BP][SI]+сдвиг [BP][DI]+сдвигDS DS SS SS
Читать еще:  Процессор 80486 шина адреса бит

В зависимости от формата операнда и режима адресации формируется объектный код или машинная команда. Форматы машинных команд достаточно разнообразны. Приведем лишь основные форматы команд с двумя операндами.

1) Формат «регистр-регистр» (2байта):

КОП d w 11 reg1 reg2

7 . 2 1 0 7 6 5 4 3 2 1 0

Команды этого формата описывают обычно действие reg1:=reg1‑reg2 или reg2:=reg2‑reg1. Поле КОП первого байта указывает на операцию (‑), которую надо выполнить. Бит w определяет размер операндов, а бит d указывает, в какой из регистров записывается результат:

w = 1 — слова d = 1 — reg1:=reg1‑reg2

= 0 — байты = 0 — reg2:=reg2‑reg1

Во втором байте два левых бита фиксированы (для данного формата), а трехбитовые поля reg1 и reg2 указывают на регистры, участвующие в операции, согласно следующей таблице:

regW=1W=0RegW=1W=0
AXALSPAH
CXCLBPCH
DXDLSIDH
BXBLDIBH

2) Формат «регистр-память» (2-4 байта):

КОП |d|w| |mod|reg|mem| |адрес (0-2 байта)

Эти команды описывают операции reg:=reg‑mem или mem:=mem‑reg. Бит w первого байта определяет размер операндов (см. выше), а бит d указывает, куда записывается результат: в регистр (d=1) или в ячейку памяти (d=0). Трехбитовое поле reg второго байта указывает операнд-регистр (см. выше), двухбитовое поле mod определяет, сколько байтов в команде занимает операнд-адрес (00 — 0 байтов, 01 — 1 байт, 10 — 2 байта), а трехбитовое поле mem указывает способ модификации этого адреса. В следующей таблице указаны правила вычисления исполнительного адреса в зависимости от значений полей mod и mem (a8 — адрес размером в байт, a16 — адрес размером в слово):

mem mod 00 01 10

000 [BX]+[SI] [BX]+[SI]+a8 [BX]+[SI]+a16

001 [BX]+[DI] [BX]+[DI]+a8 [BX]+[DI]+a16

010 [BP]+[SI] [BP]+[SI]+a8 [BP]+[SI]+a16

011 [BP]+[DI] [BP]+[DI]+a8 [BP]+[DI]+a16

100 [SI] [SI]+a8 [SI]+a16

101 [DI] [DI]+a8 [DI]+a16

110 a16 [BP]+a8 [BP]+a16

111 [BX] [BX]+a8 [BX]+a16

Замечания. Если в команде не задан адрес, то он считается нулевым.

Если адрес задан в виде байта (a8), то он автоматически расширяется со знаком до слова (a16). Случай mod=00 и mem=110 указывает на отсутствие регистров-модификаторов, при этом адрес должет иметь размер слова (адресное выражение [BP] ассемблер транслирует в mod=01 и mem=110 при a8=0). Случай mod=11 соответствует формату «регистр-регистр».

3) Формат «регистр-непосредственный операнд» (3-4 байта):

КОП |s|w| |11|КОП»|reg| |непосред.операнд (1-2 б)

Команды этого формата описывают операции reg:=reg‑immed (immed — непосредственный операнд). Бит w указывает на размер операндов, а поле reg — на регистр-операнд (см. выше). Поле КОП в первом байте определяет лишь класс операции (например, класс сложения), уточняет же операцию поле КОП» из второго байта. Непосредственный операнд может занимать 1 или 2 байта — в зависимости от значения бита w, при этом операнд-слово записывается в команде в «перевернутом» виде. Ради экономии памяти в ПК предусмотрен случай, когда в операции над словами непосредственный операнд может быть задан байтом (на этот случай указывает 1 в бите s при w=1), и тогда перед выполнением операции байт автоматически расширяется (со знаком) до слова.

4) Формат «память-непосредственный операнд» (3-6 байтов):

КОП |s|w| |mod|КОП»|mem| |адрес (0-2б)| |непоср.оп (1-2б)|

Команды этого формата описывают операции типа mem:=mem‑immed. Смысл всех полей — тот же, что и в предыдущих форматах.

Помимо рассмотренных в ПК используются и другие форматы команды с двумя операндами; так, предусмотрен специальный формат для команд, один из операндов которых фиксирован (обычно это регистр AX). Имеют свои форматы и команды с другим числом операндов.

Читать еще:  Перевод ip адреса в двоичную систему

Из сказанного ясно, что одна и та же операция в зависимости от типов операндов записывается в виде различных машинных команд: например, в ПК имеется 28 команд пересылки байтов и слов. В то же время в ассемблере все эти «родственные» команды записываются единообразно: например, все команды пересылки имеют одну и ту же символьную форму записи:

MOV op1,op2 (op1:=op2)

Анализируя типы операндов, ассемблер сам выбирает подходящую машинную команду.

Регистры указываются своими именами, например:

MOV AX,SI ;оба операнда — регистры

Непосредственные операнды задаются константными выражениями (их значениями являются константы-числа), например:

MOV BH,5 ;5 — непосредственный операнд

MOV DI,SIZE_X ;SIZE_X (число байтов, занимаемых переменной X) — непосредственный операнд

Адреса описываются адресными выражениями (например, именами переменных), которые могут быть модифицированы по одному или двум регистрам; например, в следующих командах первые операнды задают адреса:

При записи команд в символьной форме необходимо внимательно следить за правильным указанием типа (размера) операндов, чтобы не было ошибок. Тип обычно определяется по внешнему виду одного из них, например:

MOV AH,5 ;пересылка байта, т.к. AH — байтовый регистр

MOV AX,5 ;пересылка слова, т.к. AX — 16-битовый регистр;(операнд 5 может быть байтом и словом, по нему ;нельзя определить размер пересылаемой величины)

MOV [BX],300 ;пересылка слова, т.к. число 300 не может быть байтом.

Если по внешнему виду можно однозначно определить тип обоих операндов, тогда эти типы должны совпадать, иначе ассемблер зафиксирует ошибку. Примеры:

MOV DS,AX ;оба операнда имеют размер слова

MOV CX,BH ;ошибка: регистры CX и BH имеют разные размеры

MOV DL,300 ;ошибка: DL — байтовый регистр, а число 300 не

;может быть байтом

Возможны ситуации, когда по внешнему виду операндов нельзя определить тип ни одного из них, как, например, в команде

Здесь число 5 может быть и байтом, и словом, а адрес из регистра BX может указывать и на байт памяти, и на слово. В подобных ситуациях ассемблер фиксирует ошибку. Чтобы избежать ее, надо уточнить тип одного из операндов с помощью оператора с названием PTR:

MOV BYTE PTR [BX],5 ;пересылка байта

MOV WORD PTR [BX],5 ;пересылка слова

(Операторы — это разновидность выражений языка ассемблер, аналогичные функциям.)

Оператор PTR необходим и в том случае, когда надо изменить тип, предписанный имени при его описании. Если, например, X описано как имя переменной размером в слово:

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

нельзя, т.к. ее операнды имеют разный размер. Эту команду следует записать несколько иначе:

MOV AH,BYTE PTR X

Здесь конструкция BYTE PTR X означает адрес X, но уже рассматриваемый не как адрес слова, а как адрес байта. (Напомним, что с одного и того же адреса может начинаться байт, слово и двойное слово; оператор PTR уточняет, ячейку какого размера мы имеем в виду.)

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Сдача сессии и защита диплома — страшная бессонница, которая потом кажется страшным сном. 9232 — | 7434 — или читать все.

Ссылка на основную публикацию
Adblock
detector