Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура ЭВМ - лекции.doc
Скачиваний:
14
Добавлен:
22.07.2019
Размер:
318.98 Кб
Скачать

АРХИТЕКТУРА ЭВМ Катермина Татьяна Сергеевна

05.10.2011 Практика по ассемблеру

Режимы адресации ассемблера.

Режим адресации: косвенная регистровая.

Исполнительный адрес операнда (точнее, смещение относительно начала сегмента данных (data)) содержится в одном из регистров BX, BP, SI и DI. Для указания косвенной адресации этот регистр должен заключаться в квадратные скобки. Например, перешлём в регистр AX содержимое 16-разрядного слова, хранящегося в памяти DS: BX:

mov AX, [BX]

Если мы хотим сделать это принудительно, то пишем так:

mov AX, ES {BX]

Описываем пример:

var

x: Word;

b: Byte;

...

asm

mov ax, X

add ah, B

mov X, ax

Замечание:

регистр написания идентификаторов регистров значения не имеет.

Режим адресации: прямая.

Смещение операнда задаётся в теле программы и помещается в регистр DS.

Режим адресации: по базе (или базовая адресация).

Базовый регистр BX (или BP) содержит базу (адрес начала некоторого фрагмента памяти) относительно которой ассемблер вычисляет смещение. Пример:

mov ax, [bx] + 10

Где “+10” означает, что мы отодвинулись на 10 ячеек после регистра BX.

Режим адресации: индексная.

Один из индексных регистров (SI и DI) указывает положение элементов относительно начала некоторой области памяти. Например:

mov SI, 15

mov ah, AOB [SI]

mov SI, 0

mov AOB [SI] ah

В этом примере байтовый массив AOB описан ранее. В индексный регистр SI мы переслали число 15. В регистр ah мы переслали то, что хранится в массиве AOB по адресу si (т.е. по адресу 15). Затем мы в регистр SI переслали 0. И наконец в ячейку [SI] (15-ю по счёту) массива AOB мы поместили значение регистра ah, т.е. 0. Другими словами, мы просто заменили значение в 15-ой ячейке массива AOB на ноль.

Режим адресации: по базе (базовая регистровая).

Вариант индексной адресации в случае, когда индексируемая область памяти задаётся своей базой. Этот вариант удобен, когда нужно обработать двумерные массивы.

Пример:

опишем байтовый массив АОВ. Перешлём в регистр bx значение 20, перешлём в регистр si значение 2 и перешлём в регистр ax значение, которое размещается в элементе массива АОВ под номером [bx][si].

var

AOB: array [0 … 9 ; 0 … 9]

mov bx, 20

mov si, 2

mov ax, AOB[bx][si]

Пояснение: в регистр bx мы пересылаем не 2, а 20 т.к. в памяти элементы массива хранится последовательно.

Система команд ассемблера.

Представление чисел в ассемблере.

В памяти числа представляются в перевёрнутом виде, а в регистрах – в прямом виде. Например, слово (W) и двойное слово (DW) ассемблер представляет в следующем виде:

A = 98 = 001100010 = ‘62h

В ячейках регистра это будет выглядеть вот так:

А

А+1

62

00



Директивы ассемблера (идентификаторы для объявления):

  • DB – define byte

  • DW – define word

  • DD – define double word

Общий вид операции определения:

[имя] DB [операнд]

Здесь может быть несколько вариантов:

xdb? – если операнд не определён;

xdb254;

xdb-2;

xdbOPEh;

и т.д.

Пример:

M db 2,-2,?,”*”

В ячейках будет определено:

2 | -2 | неизвестно что | * (символ звёздочка)

Ещё пример:

R DB 5(dup(0))

В ячейках будет:

0 | 0 | 0 | 0 | 0

Ещё пример:

y DB -7,3(dup(0,2(dup(?)))

В ячейках будет:

-7 | 0 | ? | ? | 0 | ? | ? | 0 | ? | ?

(семёрка, а затем трижды по 0 ? ?)

Задача:

Написать матрицу 20*30 неизвестно чего.

Пишем так:

A DB 20(sup(30(dup ?)));

Ещё пример:

опишем две переменные как слова, занесём в первую из них символьное значение 01, а во вторую – единичку.

S1 DW ‘01’ (‘01’ кодируется как 30h, 31h)

S2 DW ‘1’ (‘1’ кодируется как 31h)

В ячейках получится:

31 | 30 | 31 | 00

Ещё пример:

если нам нужно определить Х как двойное слово с содержимым 12345678h, то вот как всё будет обстоять:

X DD 12345678h

Получим:

78 | 56 | 94 | 12

Задача:

описать две переменные – х и у как 4 и 3. Затем описать третью переменную, которая будет равна х+у. Пишем:

x DB 4

y DB 3

z DB ?

mov ax, x (отправили в регистр ax значение 4)

add ax, y (прибавим к содержимому регистра ax значение 3)

mov z, ax (помещаем в регистр z содержимое регистра ax)

На этом с примерами всё.

Команды перемещения:

  • mov <приёмник>, <источник> – перенести значение приёмник из источника

  • push <источник> – записать в стек

  • pop <приёмник> – извлечь значение из стека

  • xcgh <источник>, <приёмник> – поменять значения источника и приёмника

  • xlat <таблица> – загрузить в AL байт из таблицы

  • in <аккумулятор>, <порт> – считать из порта в аккумулятор

  • out <порт>, <аккумулятор> – вывести в порт из аккумулятора

Команды пересылки адреса:

  • lea <регистр>, <память 16> – загрузить исполнительный адрес

  • lds <регистр 16>, <память 32> – загрузить полный адрес

Ограничения команды mov:

  1. Из памяти в память пересылать нельзя. Обязательно нужен пересылочный регистр. Например, можно сделать так:

mov ax, x

mov x, ax

  1. Константу или переменную нельзя пересылать в регистр DS. Можно сделать это, используя пересылочный регистр. Вот так:

mov AX, DS

mov DS, AX

  1. В регистр CS пересылать ничего нельзя, т.к. он автоматически заполняется при выполнении некоторых команд.

06.10.2011 Практика по ассемблеру