СПОСОБЫ АДРЕСАЦИИ


СПЕЦИАЛЬНЫЕ

БЕЗЗНАКОВЫЕ

ЗНАКОВЫЕ

КОМАНДЫ УСЛОВНЫХ ПЕРЕХОДОВ

ВНУТРИСЕГМЕНТНЫЙ ПЕРЕХОД

 

Предположим, что адрес М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 байт тся эффективность системы команде. Современные способы адресации имеют следующие цели: определить адреса в командах наименьшим числом бит, вычисление адреса команд, относительно базы а в командах перехода – относительно следующей команды, вычисление адреса операндов на основании выражений, элементы выражений в процессе вычислений изменяются, что позволяет эффективно обрабатывать структурированные типы данных. Большинство способов адресации реализуются с помощью постбайта.