- •Лекции 17 -
- •Структура машинной
- •Структура машинной команды
- •Структура машинной команды
- •Структура машинной команды
- •Структура машинной команды
- •Сочетания операндов
- •Система команд
- •Система команд
- •Команды пересылки
- •Команды пересылки данных
- •Команды пересылки данных
- •Команды пересылки данных
- •Команды пересылки данных
- •Команды пересылки данных
- •Команды пересылки
- •Команды пересылки
- •Команды пересылки данных
- •Команды пересылки данных
- •Команды пересылки
- •Команды пересылки данных
- •Команды пересылки данных
- •Прочие команды
- •Прочие команды
- •Прочие команды
- •Команды загрузки сегментных регистров
- •Команды ввода – вывода
- •Команды ввода – вывода
- •Команды ввода – вывода
- •Команды ввода – вывода
- •Команды обработки строк
- •Команды обработки строк
- •Команды обработки строк
- •Команды обработки строк
- •Команды обработки строк
- •Команды обработки строк
- •Арифметические команды
- •Арифметические команды
- •Арифметические команды
- •Арифметические команды
- •Арифметические команды
- •Арифметические команды
- •Арифметические команды
- •Арифметические команды
- •Арифметические команды
- •Арифметические команды
- •Логические команды
- •Логические команды
- •Логические команды
- •Логические команды
- •Логические команды
- •Команды сдвигов
- •Команды сдвигов
- •Команды сдвигов
- •Команды сдвигов
- •Команды сдвигов
- •Команды сдвигов
- •Команды сдвигов
- •Команды сдвигов
- •Команды сдвигов
- •Команды обработки бит
- •Команды обработки бит
- •Команды обработки бит
- •Команды обработки бит
- •Команды обработки бит
- •Команды обработки бит
- •Команды работы с регистром флагов
- •Команды передачи управления
- •Команды передачи управления
- •Команды передачи управления
- •Команды передачи управления
- •Команды передачи управления
- •Команды передачи
- •Команды передачи управления
- •Команды передачи управления
- •Команды передачи управления
- •Команды передачи управления
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 2
- •Пример 2
- •Пример 2
- •Пример 2
- •Пример 3
- •Пример 3
- •Пример 3
- •Пример 3
- •Пример 3
- •Пример 3
Команды передачи управления
Команда вызова прерывания:
INT номер
INT 3
INTO
Номер – непосредственное 8-ми разрядное значение.
Вызывает переход на обработчик прерывания, адрес которого находится в таблице векторов прерываний. В стек заносится адрес возврата и регистр флагов.
Пример:
int 10h
Команды передачи управления
Возврат из вызова прерывания:
IRET
Осуществляет дальний переход по адресу возврата сохраненному в стеке командой INT с восстановлением регистра флагов.
Пример:
iret
Команды передачи
управленияКоманды условных переходов: Jcc Адрес
Адрес – непосредственное значение разрядностью 8, 16 или 32 бита, представляющее собой относительное смещение следующей команды. На языке Ассемблер представляются в виде меток, которые затем транслируются в непосредственные значения.
Команды условных переходов осуществляют только ближние переходы. Если необходимо выполнить дальний переход, то приходится комбинировать команду условного перехода с командой безусловного перехода.
|
Мнемоника |
Значение |
Тип операндов |
|
|
|
|
|
|
|
E e |
Equal (равно) |
Любые |
|
|
|
|
|
|
|
N n |
Not (не) |
Любые |
|
|
|
|
|
|
|
G g |
Greater (больше) |
Числа со знаком |
|
|
|
|
|
|
|
L l |
Less (меньше) |
Числа со знаком |
|
|
|
|
|
|
|
A a |
Above (выше, «больше») |
Числа без знака |
|
|
|
|
|
|
|
B b |
Below (ниже, «меньше») |
Числа без знака |
|
|
|
|
|
|
|
|
|
|
|
Команды передачи управления
Мнемоника |
|
|
Флаги |
|
|
Описание |
||
|
|
|
|
|
|
|
|
|
|
OF |
CF |
|
ZF |
|
PF |
SF |
|
|
|
|
|
|
|
|
|
|
JE / JZ |
X |
X |
|
1 |
|
X |
X |
Переход если ZF==1 |
JP / JPE |
X |
X |
|
X |
|
1 |
X |
Переход если PF==1 |
|
|
|
|
|
|
|
|
|
JO |
1 |
X |
|
X |
|
X |
X |
Переход если OF==1 |
JC |
X |
1 |
|
X |
|
X |
X |
Переход если CF==1 |
JS |
X |
X |
|
X |
|
X |
1 |
Переход если SF==1 |
JNE / JNZ |
X |
X |
|
0 |
|
X |
X |
Переход если ZF==0 |
|
|
|
|
|
|
|
|
|
JNP / JPO |
X |
X |
|
X |
|
0 |
X |
Переход если PF==0 |
|
|
|
|
|
|
|
|
|
JNO |
0 |
X |
|
X |
|
X |
X |
Переход если OF==0 |
JNC |
X |
0 |
|
X |
|
X |
X |
Переход если CF==0 |
JNS |
X |
X |
|
X |
|
X |
0 |
Переход если SF==0 |
|
|
|
|
|
|
|
|
|
Команды передачи управления
Мнемоника |
|
|
Флаги |
|
|
Описание |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
OF |
CF |
|
ZF |
|
PF |
SF |
|
|
|
|
|
|
|
|
|
|
|
||
JL / JNGE |
A |
X |
|
X |
|
X |
B |
Переход если OF!=SF, оп_1 < оп_2 |
||
|
|
|
|
|
|
|
|
|
||
JLE / JNG |
A |
X |
|
1 |
|
X |
B |
Переход если Z==1 или OF!=SF, оп_1 <= оп_2 |
||
|
|
|
|
|
|
|
|
|
||
JNL / JGE |
A |
X |
|
X |
|
X |
B |
Переход если OF==SF, оп_1 >= оп_2 |
||
|
|
|
|
|
|
|
|
|
||
JNLE / JG |
A |
X |
|
0 |
|
X |
B |
Переход если Z==0 или OF==SF, оп_1 > оп_2 |
||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
||
JB / JNAE |
X |
1 |
|
X |
|
X |
X |
Переход если CF==1, оп_1 < оп_2 |
||
|
|
|
|
|
|
|
|
|
||
JBE / JNA |
X |
1 |
|
1 |
|
X |
X |
Переход если CF==1 or ZF==1, оп_1 <= оп_2 |
||
|
|
|
|
|
|
|
|
|
||
JNB / JAE |
X |
0 |
|
X |
|
X |
X |
Переход если CF==0, оп_1 >= оп_2 |
||
|
|
|
|
|
|
|
|
|
||
JNBE / JA |
X |
0 |
|
0 |
|
X |
X |
Переход если CF==0 and ZF==0, оп_1 > оп_2 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Команды передачи управления
Команда проверки регистра (E)CX:
JECXZ / JCXZ |
Адрес |
Выполняет проверку регистра (E)CX и выполняет переход, если его значение равно нулю. Используется для организации циклов с постусловием, для проверки необходимости выполнения первой итерации цикла.
Команды передачи управления
Команды циклов:
LOOP Адрес
LOOPE Адрес
LOOPNE Адрес
Адрес – 8-ми разрядное относительное смещение, задаваемое на языке Ассемблер в виде метки.
Все команды уменьшают значение регистра (E)CX на единицу.
Условие выполнения LOOP: |
CX != 0 |
Условие выполнения LOOPE: |
CX != 0 and ZF==1 |
Условие выполнения LOOPNE: |
CX != 0 and ZF==0 |
|
|
Пример 1
Разработать программу выводящую на экран количество символов ‘A’ находящихся на экране. Количество вывести в левом верхнем углу экрана в десятичной системе счисления.
Пример 1
.486 model tiny
Code SEGMENT use16
ASSUME cs:Code, ds:Code, ss:Code
|
org |
100h |
|
|
start: |
mov |
ax, 0b800h |
;Загрузка в AX адреса сегмента видеобуфера |
|
|
|
|||
|
|
mov |
ds, ax |
;Установка DS на видеобуфер |
|
|
xor |
ax, ax |
;Очистка AX |
|
|
mov |
si, ax |
;Запись начала видеобуфера в SI |
|
|
mov |
dx, ax |
;Инициализация счетчика |
|
|
mov |
cx, 25*80 |
;Запись в CX количества повторений |
loop0: |
lodsw |
|
;Загрузка в AX из DS:[SI] |
|
|
|
cmp |
al,'A‘ |
;Сравнение с ‘A’ |
|
|
jnz |
next0 |
;Если не ‘A’, то переход на next0 |
|
|
inc |
dx |
;Инкремент DX |
next0: |
loop |
loop0 |
;Цикл |
|
|
|
|
|
|
Пример 1
|
push |
ds |
;Установка регистра ES на адрес видеобуфера |
|
pop |
es |
;из регистра DS |
|
xor |
di, di |
;Очиска DI |
|
push |
cs |
;Установка сегмента данных DS |
|
pop |
ds |
;на сегмент кода CS |
|
lea |
si, Strk |
;В SI загружаем смещение Strk |
|
add |
si, 6 |
;Переход в конец строки |
|
mov |
cx, 10 |
;В регистр CX записываем 10 |
|
mov |
ax, dx |
;В AX заносим количество символов ‘A’ из DX |
next1: |
|
|
|
|
xor |
dx, dx |
;Очистка DX |
|
div |
cx |
;Делим DX:AX на CX |
|
add |
dl, 48 |
;Прибавляем к остатку код 0 |
|
mov |
ds:[si],dl |
;Записываем в строку символ числа |
|
or |
ax, ax |
;Проверка AX на ноль |
|
jz |
next2 |
;Если AX=0, то переход на next2 |
|
dec |
si |
;Декремент SI |
|
jmp |
next1 |
;Переход на следующую итерацию |
|
|
|
|