
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Прямая адресация с индексированием
r/m │ mod = 01
│ mod = 10
──────┼───────────
100 │(SI)+d8(16) = EA
101 │(DI)+d8(16) = EA
Данный способ адресации по своим возможностям и назначению аналогичен прямой адресации с базированием. Отметим, что в данном случае регистры SI и DI обеспечивают обращение к сегменту данных.
SAB A[SI],DX
/ \
d16 + (SI) -> EA
┌── A 0 2 4
│ ┌──────┬──────┬───────────┬──────┐
│ │ A1 │ A2 │ ......... │ An │
│ └──────┴──────┴───────────┴──────┘
A - базовый адрес массива
(SI) – индекс
Пусть SI = 0, тогда -> A[SI] -> A1
SI = 4, тогда -> A[SI] -> A3
SUB A [SI] , DX
d w mod reg r/m D16
┌───────┬───┬───┐ ┌───┬───┬───┐ ┌─────────┐
│ KOП │ 0 │ 1 │ │ 10│010│100│ │адр.масив│
└───────┴───┴───┘ └───┴───┴───┘ └────┴────┘
│ └─>DX │
└─---------->(SI)+D16
Пример: Определить в массиве А сумму элементов с четными номерами,
S=A2+A4+…
A DW 10 DUP (?)
N DW 10
S DW ?
; CX:= N DIV 2
; Начальное значение DI = 2. Приращение индекса = 4;
MOV CX,N
SHR CX,1; cx:=cx/2;
MOV DX,0; Сумматор
MOV DI,2 ;начальное значение индекса
ML: ADD DX,A[DI]
ADD DI,4 ;переадресация
DEC CX
JNZ ML
MOV S,DX
Прямая адресация с базированием
r/m │ mod = 01 Команды имеют длину 3,4 байта.
│ mod = 10 Используются для обработки струк-
─────┼─────────── туированных типов данных.
110 │ (BP)+d8(16)
111 │ (BP)+d8(16)
MOV X[BX],AX EA = (BX) + d16
ADD Y[BP],CX EA = (BP) + d16
Данный способ адресации работает точно также как и прямая адресация с индексированием. Он выделен только потому, что регистры SI, DI - индексные, а BX, BP - регистры базы.
В данной команде регистр BP адресуется через DS, т. е. к сегменту данных, т.к. предполагаем, что массив Y описан в сегменте данных.
Адресация по сумме d8 и индексный регистр
ЕА = (SI) + d8
ЕА = (DI) + d8
d8 – короткое знаковое смещение. До выполнения операций сложения d8 расширяется до слова.
┌──────┬──────┬──────┬───────────┬──────┐
│ A1 │ A2 │ A3 │ ......... │ An │
└──────┴──────┴──────┴───────────┴──────┘
Пусть А3 – максимальный элемент.
SI – адрес элемента А3
MOV AL,[SI-1] ;AL:=A2 – предшествующий элемент
MOV BL,[SI+1] ;BL:=A4 – следующий элемент
Такая форма записи команд используется, когда необходимо от текущего адреса отступить вперед не более чем на 127 и отступить назад не более чем на 128. Отступ реализуется значением d8.
Если адресное расстояние выйдет за диапазон, то будет сформировано смещение d16
MOV AL,[SI-1]
d w mod reg r/m DISP
┌───────┬───┬───┐ ┌───┬───┬───┐ ┌────┐
│ KOП │ 1 │ 0 │ │ 01│000│100│ │ FF │
└───────┴───┴───┘ └───┴───┴───┘ └────┘
│ └─>AL │
└─---------->(SI)+D8
MOV AL,[SI+1]
d w mod reg r/m DISP
┌───────┬───┬───┐ ┌───┬───┬───┐ ┌────┐
│ KOП │ 1 │ 0 │ │ 01│000│100│ │ 01 │
└───────┴───┴───┘ └───┴───┴───┘ └────┘
│ └─>AL │
└─---------->(SI)+D8