abc Asembler - elektronski priručnik
XII dio Uslovi

Uslovni skok

Ako je neki specificirani uslov zadovoljen u uslovnom skoku, kontrola toka se prenosi na ciljnu instrukciju. Postoje brojne instrukcije uslovnog skoka koje zavise od uslova i podataka.
Slijede instrukcije uslovnog skoka koje se koriste na označenim podacima korištenim za aritmetičke operacije:

Instrukcija

Opis

Testirani flagovi

JE/JZ

Jump Equal ili Jump Zero

ZF

JNE/JNZ

Jump not Equal ili Jump Not Zero

ZF

JG/JNLE

Jump Greater ili Jump Not Less/Equal

OF, SF, ZF

JGE/JNL

Jump Greater ili Jump Not Less

OF, SF

JL/JNGE

Jump Less ili Jump Not Greater/Equal

OF, SF

JLE/JNG

Jump Less/Equal ili Jump Not Greater

OF, SF, ZF

Slijede instrukcije uslovnog skoka koje se koriste na neoznačenim podacima korištenim za logičke operacije:

Instrukcija

Opis

Testirani flagovi

JE/JZ

Jump Equal ili Jump Zero

ZF

JNE/JNZ

Jump not Equal ili Jump Not Zero

ZF

JA/JNBE

Jump Above ili Jump Not Below/Equal

CF, ZF

JAE/JNB

Jump Above/Equal ili Jump Not Below

CF

JB/JNAE

Jump Below ili Jump Not Above/Equal

CF

JBE/JNA

Jump Below/Equal ili Jump Not Above

AF, CF

Slijede instrukcije uslovnog skoka koje imaju specijalnu upotrebu i provjeravaju vrijednost flagova:

Instrukcija

Opis

Testirani flagovi

JXCZ

Jump if CX is Zero

nijedan

JC

Jump If Carry

CF

JNC

Jump If No Carry

CF

JO

Jump If Overflow

OF

JNO

Jump If No Overflow

OF

JP/JPE

Jump Parity ili Jump Parity Even

PF

JNP/JPO

Jump No Parity ili Jump Parity Odd

PF

JS

Jump Sign (negativna vrijednost)

SF

JNS

Jump No Sign (pozitivna vrijednost)

SF

Sintaksa za J<condition> set instrukcija:

Primjer

;set instrukcija
      CMP      AL,  BL
      JE       EQUAL
      CMP      AL,  BH
      JE       EQUAL
      CMP      AL,  CL
      JE       EQUAL
      ON_      EQUAL:  ...
      EQUAL:   ... 

Primjer
Sljedeći program prikazuje najveću od 3 varijable. Varijable su dvocifrene. 3 varijable num1, num2 i num3 imaju vrijednosti 47, 72 i 31, respektivno:

section    .text
      global _start 	;must be declared for using gcc

_start: 			;tell linker entry point
      mov   ecx,  [num1]
      cmp   ecx,  [num2]
      jg    check_third_num
      mov   ecx,  [num3]
check_third_num:
      cmp   ecx,  [num3]
      jg    _exit
      mov   ecx,  [num3]
_exit:
      mov   [largest],  ecx
      mov   ecx, msg
      mov   edx, len
      mov   ebx, 1 		;file descriptor (stdout)
      mov   eax, 4 		;system call number (sys_write)
      int   0x80 		;call kernel
      mov   ecx, largest
      mov   edx, 2
      mov   ebx, 1 		;file descriptor (stdout)
      mov   eax, 4 		;system call number (sys_write)
      int   0x80 		;call kernel

      mov   eax, 1
      int   80h

section   .data
      msg   db "Najveci broj je: ", 0xA, 0xD
      len   equ $- msg
      num1  dd  '47'
      num2  dd  '22'
      num3  dd  '31'

segment   .bss
largest  resb  2

Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:

Najveci broj je:
47

Bezuslovni skok    <    Index    >    Petlje