
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Двухоперандные команды
7 0 7 6 5 3 2 0
┌────────────┬───┬───┐ ┌─────┼─────┼─────┐ ┌ ─ ─ ┐ ┌ ─ ─ ┐
│ КОП │ d │ w │ │ mod │ reg │ r/m │ displ disph
└────────────┴─┬─┴─┬─┘ └──┬──┴───┬─┴─┬───┘ └ ─ ─ ┘ └ ─ ─ ┘
бит направления │ │ режим │ │ │ смещение адреса
────────────────┘ │ ──────┘ │ │
бит слова │ поле определения │ │ поле определения
───────────┘ второго операнда │ │ первого операнда
─────────────────┘ └───────────────────
┌──────────────┐ d=0, условное направление ┌───────────────┐
│ │ из МП 1 │ │
│ 2-й ├───────────────────────────>│ 1-й │
│ операнд reg │ │ операнд r/m │
│ │ d=1, условное направление │ │
│ │ в МП │ │
│ │<───────────────────────────┤ │
└──────────────┘ 2 └───────────────┘
W=1, если операнд слово.
W=0, если байт.
d=1, - передача результата в МП.
d=0, - передача результата из МП.
Если оба операнда в регистрах процессора, то d=1, т.к. результат в на регистре процессора.
Пример:
ADD AX,B AX:=AX+B -> результат в МП - d=1
ADD B,BX B:=B+BX -> результат в память - d=0
ADD AX,BX AX:=AX+BX -> результат в МП - d=1
Условное обозначение ОР1 и ОР2 не согласуются с мнемоникой:
Мнемоника: КОП ОР1 , ОР2
/ \
может быть 1-й или 2-й операнд
Таблица. Определение первого операнда в постбайте.
┌─────┬────────────────────────────────────────────────────────┐
│ r/m │ mod │
│ ├───────────┬──────────────┬───────────────┬─────────────┤
│ │ 00 │ 01 │ 10 │ 11 │
│ │ │ │ ├───────┬─────┤
│ │ │ │ │ w=0 │ w=1 │
├─────┼───────────┼──────────────┼───────────────┼───────┼─────┤
│ 000 │ (BX)+(SI) │ (BX)+(SI)+D8 │ (BX)+(SI)+D16 │ AL │ AX │
│ 001 │ (BX)+(DI) │ (BX)+(DI)+D8 │ (BX)+(DI)+D16 │ CL │ CX │
│ 010 │ (BP)+(SI) │ (BP)+(SI)+D8 │ (BP)+(SI)+D16 │ DL │ DX │
│ 011 │ (BP)+(DI) │ (BP)+(DI)+D8 │ (BP)+(DI)+D16 │ BL │ BX │
│ 100 │ (SI) │ (SI)+D8 │ (SI)+D16 │ AH │ SP │
│ 101 │ (DI) │ (DI)+D8 │ (DI)+D16 │ CH │ BP │
│ 110 │ (D16) * │ (BP)+D8 │ (BP)+D16 │ DH │ SI │
│ 111 │ (BX) │ (BX)+D8 │ (BX)+D16 │ BH │ DI │
└─────┴───────────┴──────────────┴───────────────┴───────┴─────┘
* исключение - прямая адресация.
Если MOD=11 то адресация регистровая.
Первый операнд задается адресом памяти или регистром процессора. Второй операнд может располагаться в регистре процессора или представляется константой - непосредственный операнд
Каждому регистру можно присвоен свой номер. Номера регистров определяются последними 2-мя колонками таблицы постбайта.
Если MOD<>11, то первый операнд находится в памяти и может задаваться одним из 24 способов адресации. Если MOD = 11, то первый операнд находится в регистре процессора и может задаваться одним из 16-ти способами адресации.
Т.о. каждая клетка таблицы (всего 40 клеток) определяет способ вычисления исполнительного адреса, например, ЕА=(BX)+(DI)+d16, строка r/m=001, столбец mod=10.
ЕА – исполнительный адрес - беззнаковая величина. Составляющие ЕА являются в общем случае величинами знаковыми. Однако после их сложения значение ЕА получается беззнаковой величиной, иначе – ошибка.
D8 или D16 это знаковое смещение адреса, которое содержится в команде и как компонент участвует в вычислении исполнительного адреса EA.
С другой стороны, EA является смещением относительно начала сегмента и используется для вычисления физического адреса памяти.
Колонки MOD = 00,01,10 имеют регулярную структуру. Нарушение только в одном квадрате:
r/m = 110
MOD = 00, что соответствует прямой адресации.
Код команды MOV X,BP
d w mod reg r/m
┌───────┬───┬───┐ ┌───┬───┬───┐┌─────────┐ - прямой исполнительный
│ KOП │ 0 │ 1 │ │ 00│101│110││ disp16 │ адрес переменной Х
└───────┴───┴───┘ └───┴───┴───┘└─────────┘
ЕА = disp16. Номер регистра BP определяется reg=101.