Команди умовних та безумовних переходів
Вхідний контроль:
1 Які ознаки результату, що формуються у МПС фірми Intel, Ви знаєте?
2 В якому випадку формується ознака ZF?
3 Яким чином формується ознака знаку результату SF?
4 Чим відрізняється формування ознак перенесення CF і переповнення OF?
5 Наведіть приклад реалізації умовного переходу будь-якою мовою високого рівня.
6 Наведіть приклад реалізації безумовного переходу будь-якою мовою високого рівня.
До групи таких команд відносяться команди, які можуть зробити перехід не до наступної за даною командою, а до команди, яка знаходиться в іншій комірці програмної пам’яті, адреса якої визначається адресою переходу. Команди передачі керування підрозділяються на команди безумовних переходів, умовних переходів, викликів і повернення з підпрограм, команди переривань.
Команди безумовних переходів
При виконанні таких команд виконується зміна вмісту регістра РС або одночасно РС і CS. Команди такого типу мають довжину 2...5 байтів у залежності від типу переходу і довжини зміщення у команді, яким задається адреса переходу.
JMP (JuMP)– команда безумовного переходу
Команда має вигляд
JMP мітка.
Мітка може відповідати 8-, 16- або 32-розрядному зміщенню відносно наступної за JMP команди. При цьому змінюється лише вміст EIP/IP. Якщо мітка у команді – символічний ідентифікатор комірки пам’яті (16-, 32- або 48-розрядна адреса, то Асемблер визначає його як адресу, по якій необхідно зробити перехід. Така адреса може відповідати, як близькому, так і далекому переходу.
Команди умовних переходів
При виконанні цих команд мова асемблера робить аналіз певних ознак результатів і за результатами аналізу здійснює або не здійснює передачу керування.
Jcc (Jump if condition) –команда умовного переходу.
Перелік команд умовного переходу й умов, які перевіряються, подано у табл. 9.4.
Таблиця 9.4 – Команди умовних переходів
№ пп. | Дія | Мнемоніка та формат | Альтернативна мнемоніка | Умова, що перевіряється |
Перейти, якщо нуль або дорівнює | JZ ADDR | JE ADDR | ZF=1 | |
Перейти, якщо не нуль або не дорівнює | JNZ ADDR | JNE ADDR | ZF=0 | |
Перейти, якщо знак установлено | JS ADDR | SF=1 | ||
Перейти, якщо знак скинуто | JNS ADDR | SF=0 | ||
Перейти, якщо є переповнення | JO ADDR | OF=1 |
Продовження табл. 9.4 | ||||
№ п.п | Дія | Мнемоніка та формат | Альтернативна мнемоніка | Умова, що перевіряється |
Перейти, якщо немає переповнення | JNO ADDR | OF=0 | ||
Перейти, якщо паритет установлений | JP ADDR | JPE ADDR | PF=1 | |
Перейти, якщо паритет скинуто | JNP ADDR | JPO ADDR | PF=0 | |
Перейти, якщо вище (без знака) | JА ADDR | CF=0, ZF=0 | ||
Перейти, якщо нижче (без знака) | JNА ADDR | CF=1, ZF=1 | ||
Перейти, якщо вище/ або дорівнює (без знака) | JАE ADDR | CF=0 | ||
Перейти, якщо нижче/ або дорівнює (без знака) | JBE ADDR | CF=1, ZF=1 | ||
Перейти, якщо нижче/не вище або дорівнює (без знака) | JB ADDR | JNAE ADDR JC ADDR | CF=1 | |
Перейти, якщо не нижче/ вище або дорівнює (без знака) | JNBE ADDR | JNB ADDR JNC ADDR | CF=0 | |
Перейти, якщо є перенесення/позика | JC ADDR | CF=1 | ||
Перейти, якщо перенесення/позики немає | JNC ADDR | CF=0 | ||
Перейти, якщо менше/ не більше або дорівнює ( зі знаком) | JL ADDR | JNGE ADDR | ((CF) XOR(OF))=1 | |
Перейти, якщо не менше/ більше або дорівнює ( зі знаком) | JNL ADDR | JGE ADDR | ((CF) XOR(OF))=0 |
Закінчення табл. 9.4
№ п.п | Дія | Мнемоніка та формат | Альтернативна мнемоніка | Умова, що перевіряється |
Перейти, якщо менше або дорівнює/не більше (зі знаком) | JLE ADDR | ((SF) XOR(OF)OR(ZF))=1 | ||
Перейти, якщо не менше або дорівнює/більше (зі знаком) | JNLE ADDR | JG ADDR | ((SF) XOR(OF)OR(ZF))=0 |
Використання і пояснення роботи деяких команд наведено у наступній програмі:
M1: NOP ; Команда NOP (No Operation) – немає
; операції, рядок помічено міткою М1
M2: JMP M4 ; операції немає, рядок помічено міткою М2
M3: JMP M5 ; команда безумовного переходу на мітку М4
M4: MOV AX,5678H ; завантаження до регістра АХ числа 5678Н
MOV BX,1234H ; завантаження до регістра ВХ числа 1234Н
CMP AX,BX ; порівняння вмісту регістра АХ з вмістом
; регістра ВХ
JZ M1 ; умовний перехід на мітку М1, якщо результат
; порівняння дорівнює 0 (операнди рівні).
; У нашому випадку умовний перехід не
; відбувається, тому що операнди не рівні і
; прапорець ZF скинуто в 0
JNS M2 ; умовний перехід на мітку М2, якщо результат
; порівняння додатний (прапорець SF = 0). У
; нашому випадку не відбувається, тому що
; 1234Н
; 5678Н
; ВВВСН (прапорець SF = 1)
JLЕ M3 ; умовний перехід на мітку М3, якщо вміст
; операнда dst (приймач) менший за операнд
; src (джерело). В нашій програмі відбувається
М5: NOP