
- •Режимы адресации ассемблера.
- •Арифметические команды Ассемблера.
- •Периферийные шины.
- •Последовательные универсальные шины.
- •Последовательная шина usb.
- •Семейство последовательных интерфейсов pci-Express.
- •Команды передачи управления
- •Системные платы.
- •Разновидности системных плат.
- •Чипсеты системных плат.
- •Доклад Игоря.
- •Классификация по Флинну.
- •Системы с конвейерной обработкой данных.
АРХИТЕКТУРА ЭВМ Катермина Татьяна Сергеевна |
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:
Из памяти в память пересылать нельзя. Обязательно нужен пересылочный регистр. Например, можно сделать так:
mov ax, x
mov x, ax
Константу или переменную нельзя пересылать в регистр DS. Можно сделать это, используя пересылочный регистр. Вот так:
mov AX, DS
mov DS, AX
В регистр CS пересылать ничего нельзя, т.к. он автоматически заполняется при выполнении некоторых команд.
06.10.2011 Практика по ассемблеру |