
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Форматы команды inc
Inc mem/reg8 ;память или 8-разр. регистр
Inc reg16 ;16-разр. регистр
**Inc [BX+SI] – НЕВОЗМОЖНО, т.к. неизвестно байт это, или слово.
Inc word ptr [BX+SI]
┌──────┬─┐ ┌──┬─────┬───┐
│ kop │1│ │00│ кор │000│
└──────┴─┘ └──┴─────┴───┘
w mod reg r/m
Inc BL
┌──────┬─┐ ┌──┬─────┬───┐
│ kop │0│ │11│ кор │011│
└──────┴─┘ └──┴─────┴───┘
w mod reg r/m
Inc BX
7 3 2 0
┌──────┬───┐ ┌─────┬───┐
│ kop │reg│ │ кор │011│ Команда однобайтовая
└──────┴───┘ └─────┴───┘
│ reg
└─ второй «укороченный» формат для 16-разр. Регистров без постбайта.
Аналогично построены форматы команды DEC.
Сокращают код программы и повышают ее эффективность.
Форматы команд pop и push
POP mem16
POP reg16
Команды работы со стеком всегда работают только со словами, поэтому запись команды:
POP AL – синтаксическая ошибка
POP AX
┌─────┬───┐
│ кор │000│ Команда однобайтовая
└─────┴───┘
reg
если используется память, то:
PUSH A[BX+SI] ; A – обязательно слово
┌──────┬─┐ ┌──┬─────┬───┐ ┌─────────┐
│ kop │1│ │10│ кор │001│ │ адрес А │
└──────┴─┘ └──┴─────┴───┘ └────┴────┘
w mod reg r/m disp16
Однобайтные команды без операндов
RET, CBW, CWD, CLI, STC и др. имеют только код операции:
7 0
┌─────┐
│ кор │
└─────┘
Команды передачи данных mov
Mov OP1,OP2
(1) Mov mem/reg,mem/reg
(2) Mov mem/reg,data
(3) Mov AC,data
Такие же форматы, как для двухоперандных арифметических команд.
Команда MOV наиболее часто используется в программах, и специально для нее предложены дополнительные форматы:
Mov reg,data
┌───────┬──┬───┐ ┌─────┐ ┌ ─ ─ ┐
│ KOP │W │reg│ │dataL│ dataH
└───────┴──┴───┘ └─────┘ └ ─ ─ ┘
└ любые 8,16 разрядные
Mov AC/mem,mem/AC
Пример:
Mov BP,-10
┌───────┬──┬───┐ ┌─────┐
│ KOP │1 │101│ │FF F6│
└───────┴──┴───┘ └──┴──┘
Mov Sreg,mem/reg
Mov mem/reg,Sreg
┌───────┐ ┌───┬────┬─────┐ ┌ ─ ─ ─┐ ┌ ─ ─ ┐
│ KOP │ │mod│Sreg│ r/m │ dispL dispH
└───────┘ └───┴────┴─────┘ └ ─ ─ ─┘ └ ─ ─ ┘
┌────┬───┴───┬────┐
┌──┴┐ ┌─┴─┐ ┌─┴─┐ ┌┴──┐
000 001 010 011
ES CS SS DS
Сегментные регистры только 16 разрядные
Команда обмена xchg
XCHG OP1,OP2
XCHG reg,reg/mem
Команда загрузки исполнительного адреса lea
LEA OP1,OP2
LEA reg,mem
┌───────┐ ┌───┬───┬───┐ ┌────┐
│ KOP │ │mod│reg│r/m│ │disp│
└───────┘ └───┴───┴───┘ └────┘
* d – нет, т. к. адрес всегда загружается в регистр МП
* w – нет, т. к. адрес загружается только в 16-ти разрядный регистр.
┌───────┐ ┌───┬───┬───┐
│ KOP │ │mod│reg│r/m│
└───────┘ └───┴───┴───┘
└───────┴───── обозначают только память, поэтому mod <> 11
LEA BX,A
A┌──┬──┬──┬──┬──┬──┬──┐
│a1│a2│..│..│..│..│aN│
└──┴──┴──┴──┴──┴──┴──┘
┌──────┐ ┌──┬─────┬───┐ ┌─────────┐
│ kop │ │00│ 011 │110│ │ адрес А │
└──────┘ └──┴─────┴───┘ └────┴────┘
Поле disp прямого адреса А формируется на этапе трансляции, выполняется действие BX:=disp, при выполнении команды обращения к памяти не происходит, потому что поле disp можно считать НО.
Действие команды эквивалентно:
mov bx,offset A
bx:=адрес А