СПОСОБЫ АДРЕСАЦИИ
СПЕЦИАЛЬНЫЕ
БЕЗЗНАКОВЫЕ
ЗНАКОВЫЕ
КОМАНДЫ УСЛОВНЫХ ПЕРЕХОДОВ
ВНУТРИСЕГМЕНТНЫЙ ПЕРЕХОД
Предположим, что адрес М2 равен 439Fh.
адрес М2 439Fh
адрес команды – 0325h
--------------------
disp = 407Ah >0 - переход вперед
| >127
┌───────┐ ┌───────┐
│ KOП │ │ 407A │
└───────┘ └───────┘
disp
При выполнении этой команды адрес перехода вычисляется аналогично.
Переходы вперед выделяются длинные (3 байта), но если переход короткий, то программист указывает:
JMP short M2
Используют только короткий переход (-128..127)
При выходе за диапазон выдается синтаксическая ошибка.
Аналог в Паскале:
if a=0 then goto met
1) CMP A,0 ; синтаксическая ошибка
JZ MET ; если адресное расстояние >127
2) иначе
CMP A,0
JNZ M1
JMP MET
M1: продолжение программы.
Команды условных переходов делятся на:
- знаковые
- беззнаковые
- спец. назначения
┌─────────┬─────────────┬─────────────────────────────────────┐
│Переход │Флаги │ Примечания │
├─────────┼─────────────┼─────────────────────────────────────┤
│JE/JZ │ ZF │Если равно / Если ноль │
├─────────┼─────────────┼─────────────────────────────────────┤
│JNE/JNZ │ ┐ZF │Если не равно / Если не ноль │
├─────────┼─────────────┼─────────────────────────────────────┤
│JG/JNLE │┐ZF&(SF=OF) │Если > / Если не < и не равно │
├─────────┼─────────────┼─────────────────────────────────────┤
│JGE/JNL │ SF=OF │Если >= / Если не < │
├─────────┼─────────────┼─────────────────────────────────────┤
│JL/JNGE │ (SF<>OF) │Если < / Если не > и не равно │
├─────────┼─────────────┼─────────────────────────────────────┤
│JLE/JNG │ZF V (SF<>OF)│Если =< / Если не > │
└─────────┴─────────────┴─────────────────────────────────────┘
┌─────────┬────────────┬──────────────────────────────────────┐
│Переход │Флаги │ Примечания │
├─────────┼────────────┼──────────────────────────────────────┤
│JE/JZ │ ZF │Если равно / Если ноль │
├─────────┼────────────┼──────────────────────────────────────┤
│JNE/JNZ │ ┐ZF │Если не равно / Если не ноль │
├─────────┼────────────┼──────────────────────────────────────┤
│JA/JNBE │ ┐ZF & ┐CF │Если выше / Если не ниже и не равно │
├─────────┼────────────┼──────────────────────────────────────┤
│JAE/JNB │ ┐CF │Если выше или равно / Если не ниже │
├─────────┼────────────┼──────────────────────────────────────┤
│JB/JNAE │ CF │Если ниже / Если не выше и не равно │
├─────────┼────────────┼──────────────────────────────────────┤
│JBE/JNA │ CF V ZF │Если ниже или равно / Если не выше │
└─────────┴────────────┴──────────────────────────────────────┘
┌─────────┬────────────┬──────────────────────────────────────┐
│Переход │Флаги │ Примечания │
├─────────┼────────────┼──────────────────────────────────────┤
│ JS │ SF │переход по минусу │
├─────────┼────────────┼──────────────────────────────────────┤
│ JNS │ ┐SF │переход, если знак равен нулю │
├─────────┼────────────┼──────────────────────────────────────┤
│ JC │ CF │переход по переносу │
├─────────┼────────────┼──────────────────────────────────────┤
│ JNC │ ┐CF │переход по отсутствию переноса │
├─────────┼────────────┼──────────────────────────────────────┤
│ JO │ JF │переход по переполнению │
├─────────┼────────────┼──────────────────────────────────────┤
│ JNO │ ┐OF │переход по отсутствию переполнения │
├─────────┼────────────┼──────────────────────────────────────┤
│ JP │ PF │переход по паритету │
├─────────┼────────────┼──────────────────────────────────────┤
│ JNP │ ┐PF │переход по отсутствию паритета │
└─────────┴────────────┴──────────────────────────────────────┘
Команды условного перехода флаги не изменяют!
Пример лабораторной работы N2:
┌
│(A^2)*B if A^2 - 5 > 0
y = { 100 if A^2 - 5 = 0
│(A^2)*(B^2) if A^2 - 5 < 0
└
A dw 7
B dw 8
y dw ?
mov ax,A
imul ax
mov cx,ax ;A^2
sub ax,5
jz m2
jl m3
mov ax,B ;
imul cx ; >0
jmp short kon ;
;--------------------------
m2: mov ax,100 ;
jmp short kon ; =0
;--------------------------
m3: mov ax,B ;
imul ax ;
neg ax ; <0
add ax,cx ;
;--------------------------
kon: mov y,ax
ret
Первые ЭВМ имели прямой способ адресации:
КОП ОР1 ОР2 При прямой адресации все ко-
┌───────┐ ┌───────┐ ┌───────┐ манды имели бы длину 6 байтов.
│ KOП │ │Адр.op1│ │Адр.ор2│ Однако в IBM PC команды имеют
└───────┘ └───────┘ └───────┘ длину от 1 до 6 байтов. В мень-
7 0 19 0 19 0 шей степени используются длин-
\-------------V--------------/ ные команды. В этом и проявля-
6 байт тся эффективность системы команде. Современные способы адресации имеют следующие цели: определить адреса в командах наименьшим числом бит, вычисление адреса команд, относительно базы а в командах перехода – относительно следующей команды, вычисление адреса операндов на основании выражений, элементы выражений в процессе вычислений изменяются, что позволяет эффективно обрабатывать структурированные типы данных. Большинство способов адресации реализуются с помощью постбайта.