
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения 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
─────┼────────────────
000 │ (BX)+(SI)+d8(16)
001 │ (BX)+(DI)+d8(16)
010 │ (BP)+(SI)+d8(16)
011 │ (BP)+(DI)+d8(16)
Данный способ адресации позволяет проводить эффективную обработку двумерных массивов.
┌───┬───┬───┬───┬───┐ А – прямой адрес матрицы или
; │A11│A12│A13│A14│A15│>┐ адрес первого элемента
; └───┴───┴───┴───┴───┘ │ BX – смешение строк матрицы
; ┌───────────────────────┘
; │ ┌───┬───┬───┬───┬───┐
; └>│A21│A22│A23│A24│A25│>┐
; └───┴───┴───┴───┴───┘ │;
; ┌───────────────────────┘
; │ ┌───┬───┬───┬───┬───┐
; └>│A31│A32│A33│A34│A35│
; └───┴───┴───┴───┴───┘
MOV BX,0 ;первая строка
;Дельта BX = m * size(A) - нашем случае - 1 байт
;SI - смещение элементов внутри строки
MOV si,0 ; -> текущий элемент в строке
;Дельта SI = size(A) - нашем случае - 1 байт
;EA = (базовый адрес А) + (BX) + (SI)
Двухоперандная команда, в которой второй операнд непосредственный
7 0 7 0
┌───────┬──┬─┐ ┌───┬────┬─────┐ ┌ ─ ─ ─┐ ┌ ─ ─ ┐ ┌─────┐ ┌ ─ ─ ┐
│ KOP │S │W│ │mod│ kop│ r/m │ dispL dispH │dataL│ dataH
└───────┴──┴─┘ └───┴────┴─────┘ └ ─ ─ ─┘ └ ─ ─ ┘ └─────┘ └ ─ ─ ┘
Бит направления d в данной команде не нужен, т. к. результат помещается только на место первого операнда. Поэтому биты s,w определяют формат второго операнда. Поле reg в постбайте используется для расширения кода операции
┌──
│ *0, один байт данных dataL
sw=│ 01, два байта данных dataL dataH
│ 11, один байт данных, при выполнении команды расширяется до слова
└──
Add bx,5h
│ └────────────────┐
└─────────┐ │
┌──────┬─┬─┐ ┌──┬─────┬───┐ ┌─────┐
│ kop │0│1│ │11│ кор │011│ │00 05│
└──┬───┴─┴─┘ └──┴──┬──┴───┘ └──┴──┘
│ s w mod │ r/m data
└───────┬────────┘
код операции
Предположим, что А имеет размерность byte, тогда:
Sub A[BX+SI],-8 – НО с базированием и индексированием
┌──────┬─┬─┐ ┌──┬─────┬───┐ ┌─────────────┐ ┌──┐
│ kop │0│0│ │10│ кор │000│ │ пр. адрес А │ │F8│
└──────┴─┴─┘ └──┴─────┴───┘ └──────┴──────┘ └──┘
disp dataL
Формат двухоперандных команд с акумулятором и но
Аккумулятор целесообразно использовать чаще при записи программы, т. к. для него реализован специальный укороченный формат без post-байта
┌───────┬─┐ ┌─────┐ ┌ ─ ─ ┐
│ KOP │W│ │dataL│ dataH
└───────┴─┘ └─────┘ └ ─ ─ ┘
Mov AL,5h
┌───────┬─┐ ┌────┐
│ KOP │0│ │ 05 │
└───────┴─┘ └────┘
w
Этот формат работает для AL и AX. Аккумулятор подразумевается по умолчанию.
w = 0 -> AL
w = 1 -> AX
В самой команде код регистра отсутствует:
Sub AX,-1
└┬──────┘ │
┌───────┬─┐ ┌─────┐
│ KOP │1│ │FF FF│
└───────┴─┘ └──┴──┘
w data
Все двухоперандные команды имеют по 3 формата:
1) Add mem/reg,mem/reg
2) Add mem/reg,data ;используется постбайт и непосредственный операнд
3) Add AC,data ;AC – аккумулятор и непосредственный операнд без постбайта
------------------------------------------------------------
В однооперандных командах типа умножения и деления используется один формат:
Imul mem/reg
Второй и третий форматы не используются, т. к. умножение на константу не предусмотрено.