Короткий относительный переход

КОМАНДЫ БЕЗУСЛОВНОГО ПЕРЕХОДА JMP

КОМАНДА СРАВНЕНИЯ CMP

CWD – расширение слова в двойное слово

 

DX AX>0

┌┬─────┬────┐

┌────────┐ ┌────────┐

│00.....0│ │0.......│

└────────┘ └────────┘

 

Пример:

 

A^2 - B^3 + 3*C B^3 - X/4

X = --------------- Y = ----------

2*A^2 - C A

 

sseg segment stack 'stack'

db 64 dup(0)

sseg ends

dseg segment

a db -3

b db 5

c db 2

x db ?

y db ?

dseg ends

cseg segment

assume ss:sseg,ds:dseg,cs:cseg

;Директива assume определяет сегментные регистры

;с помощью которых будет выполняться адресация

;к сегментам программы

lab1 proc far

;главную программу будем оформлять в виде

;дальней процедуры

push ds ; необходимы для

sub ax,ax ; возвращения (mov ax,0)

push ax ; в ДОС.

;++++++++++++++++++++++++++++++++++++++++++++++++++

mov ax,dseg; инициализация

mov ds,ax ; регистра ds

;++++++++++++++++++++++++++++++++++++++++++++++++++

;В регистр DS заносится адрес сегмента

;данных параграфа. В этом случае

;DS установлен на начало сегмента данных

;Две команды, потому что команды mov ds,dseg

;не существует

;При запуске exe-файла ОС в сегментные

;регистры ds и es заносит адрес PSP, т.е.

;эти регистры не инициализированы

;В сегментный регистр ss заносится адрес

;при наличии параметра stack. В нашем

;случае ss инициализирован

;Сегментный регистр cs инициализируется

;всегда ОС.

mov al,a

imul al ;al=a^2

mov bh,al ;a^2->bh

mov al,b

imul al ;al=b^2

imul b ;al=b^3

mov bl,al ;b^3->bl

mov al,3h

imul c ;al=3*c

add al,bh ;a^2+3c

sub al,bl ;a^2-b^3+3c

mov ch,al

mov al,2

imul bh ;2*a^2

sub al,c

mov cl,al ;2*a^2-c

mov al,ch ;\

cbw ; в ax - числитель

idiv cl

mov x,al

;закончено вычисление 1-ой формулы

mov cl,4h

cbw

idiv cl ;x/4

neg al ;-x/4

add al.bl ;b^3-x/4

cbw

idiv a

mov y,al

ret

lab1 endp

cseg ends

end lab1

;Последний end в поле операндов, которое соответствует

;стартовому адресу программы. В данном случае это начало

;процедуры или адрес 1-ой команды программы. Относительно

;начала сегмента этот адрес равен 0, поэтому в регистр IP

;заносится 0.

Если будет указано другое имя, то программа начнет выполняться с команды, адрес которой соответствует этому имени. В этом случае стартовый адрес <> 0.

 

 

 

CMP OP1,OP2

Работает аналогично команде вычитания, однако результат формируется, но не записывается. По значению результата взводятся все 6 флагов. Позволяет сравнивать знаковые и беззнаковые операнды. Обычно после этой команды стоит команда условного перехода.

 

 

 

JMP MET

Рассмотрим два формата этой команды из 5 существующих.

 

 

Осуществляет переход в пределах от -128..127

Формат:

┌───────┐ ┌───────┐

│ KOP │ │ dispL │ – смещение

└───────┘ └───────┘

Для работы этой команды требуются метки.

 

0308 m1: mov al,cl

.......................

.......................

0321 jmp m1 ; 2 байта

0323 jmp m2 ; 2 байта

0325 mov al,5

.......................

.......................

033f m2: add al,cl

 

Рассмотрим формирование поля disp jmp m1

Команда занимает 2 байта

disp = ( адрес m1 )-( адрес след. команды )

 

0308h Короткий переход формируется, если число

- 0323h расположено в пределах от -128..127. В

-------- этом случае знаковый разряд и все биты

f f e5h старшего разряда совпадают

 

┌┬┬┬┬┬┬┬──────┐

┌────────┐ ┌────────┐

│11111111│ │11100101│

└────────┘ └────────┘

 

Старший байт разряда содержит распространение знакового разряда и поэтому может не использоваться.

В данном случае disp = e5h

Если смещение не укладывается в диапазон байта со знаком, то будет формироваться формат команды jmp, которая называется "внутрисегментным переходом".

Рассмотрим алгоритм выполнения команды:

 

JMP M1

IP = 0323h

disp = E5h – команда вычисляет адрес перехода, который всегда 16-ти разрядный, поэтому необходимо выполнить расширение смещения до слова, как это делает команда CBW.

При расширении:

┌───┬───┐

disp │ FF│ E5│

└───┴───┘

disp + IP = 0323h

FFE5h

-----

0308h = IP

Результат заносится в регистр IP.

Следующая команда выбираться по адресу 0308h. Все команды перехода изменяют естественный порядок следования команд.

В командах переходов используется относительная адресация: адрес перехода вычисляется относительно адреса следующей команды.

 

АДРЕСАЦИЯ – это способ вычисления адреса перехода или адреса операндов. В арифметико-логических командах вычисления – адреса операндов, а в командах перехода и управления – адреса переходов.

 

Пример: Вычисление транслятором смещения команды JMP M2

 

JMP M2

┌───────┐ ┌───────┐

│ KOП │ │ disp │

└───────┘ └───────┘

адрес М2 033Fh

адрес команды -0325h

--------------------

disp = 001Ah - в disp заносится мл. байт

 

Выполнение команды:

0325h – адрес следующей команды

+001Ah – disp

----------

033Fh – адрес перехода в IP

 

Запись команды JMP короткого и внутрисегментного перехода имеют один и тот же вид: т. е. JMP METКА.

Транслятор самостоятельно вычисляет смешение метки относительно следующей команды и в зависимости от значения формирует короткий или внутрисегментный переход.