
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Косвенная адресация
MOD = 00 – косвенная адресация
r/m = 100,101,111
EA = (BX) MOV AX,[BX]
EA = (SI) ADD AL,[SI]
EA = (DI) SUB [DI],BP
При косвенной регистровой адресации выполняется обращение к одному из регистров (BX,SI,DI) откуда извлекается прямой адрес операнда в памяти. По этому адресу выполняется обращение к памяти.
Команды, использующие косвенную адресацию, всегда адресуются по DS
Физический адрес = DS + EA -> адрес в сегменте данных.
Косвенная адресация через BP не реализована т.к. имеется исключение [d16] (прямая адресация. Однако косвенная адресация через BP моделируется использованием клетки r/m = 110, MOD = 01.
EA = (BP) + d8, приусловии d8=0. Напимер,
MOV [BP+0],AX, что равно MOV [BP],AX и
MOV BX,[BP+0], что равно MOV BX,[BP].
Адресация выполняется по умолчанию через регистр SS, физический адрес равен = SS + EA, т. е. выполняется обращение к сегменту стека.
┌─< MOV [BP],AX
│ d w mod reg r/m dispL
┌───────┬───┬───┐ ┌───┬───┬───┐┌─────────┐
│ KOП │ 0 │ 1 │ │ 01│000│110││ 00 │ -> смещение = 0
└───────┴───┴───┘ └───┴───┴───┘└─────────┘
└─> MOV [BP+0],AX └─> номер АХ
ПРИМЕР ФОРМАТА КОМАНД С ЧИСТО КОСВЕННОЙ АДРЕСАЦИЕЙ
MOV AX,[BX]
┌───────┬───┬───┐ ┌───┬───┬───┐┌ ─ ─ ─ ─ ┐
│ KOП │ 1 │ 1 │ │ 00│000│111│ disp -> смещение = 0
└───────┴───┴───┘ └───┴───┴───┘└ ─ ─ ─ ─ ┘ поля disp нет
EA = (BX)
При использовании косвенной адресации команды с постбайтом самые короткие – 2 байта.
В данной команде 2 операнда:
1) регистр – кодируется 3-мя битами (поле REG)
2) в памяти, кодируется 5 битами (поле MOD, r/m)
Пример:
Вычислить сумму элементов массива Х:
x db 10 DUP (?)
n dw 10
s db ?
;-----------------------------------
;считаем, что массив Х каким-то образом определен.
MOV DL,0 ; - сумматор
MOV CX,N ; - число повторений -> счетчик цикла
MOV BX,offset X
;беззнаковое смещение – BX положить равным адресу поля Х
0 1 2 9
┌──────┬──────┬───────────┬──────┐
│ Х1 │ Х2 │ ......... │ Х10 │
└──────┴──────┴───────────┴──────┘
Адрес Х – это одновременно и адрес 1-го элемента – Х1.
Для того, чтобы перейти к Х2 нужно BX:=BX+1
ML: ADD DL,[BX]
INC BX ; переадресация на следующий элемент мас-
DEC CX ; сива уменьшили счетчик
JNZ ML
MOV S,DL
Регистровая адресация
Если операнд находится в регистре, то такая адресация называется регистровой, однако в общем случае говорят, о регистровой адресации, когда оба операнда в регистрах (MOD = 11).
Пример
ADD AL,CL
d w mod reg r/m
┌───────┬───┬───┐ ┌───┬───┬───┐
│ KOП │ 1 │ 0 │ │ 11│000│001│
└───────┴───┴───┘ └───┴───┴───┘
│ └─>AL │
└─---------->CL
Все команды с постбайтом имеют длину 2 байта.
MOV BP,DX d w mod reg r/m
┌───────┬───┬───┐ ┌───┬───┬───┐
│ KOП │ 1 │ 1 │ │ 11│101│010│ – в этом случае – 2 байта
└───────┴───┴───┘ └───┴───┴───┘