Короткий относительный переход
КОМАНДЫ БЕЗУСЛОВНОГО ПЕРЕХОДА 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КА.
Транслятор самостоятельно вычисляет смешение метки относительно следующей команды и в зависимости от значения формирует короткий или внутрисегментный переход.