Anda di halaman 1dari 6

Program Flow Control

Object:
.Using instructions for Unconditional and conditional branch

Theory:
Controlling the program flow is a very important thing, this is where your
program can make decisions according to certain conditions.

• Unconditional Jumps

The basic instruction that transfers control to another point in the program
is JMP.

The basic syntax of JMP instruction:

JMP label

To declare a label in your program, just type its name and add ":" to the
end, label can be any character combination but it cannot start with a
number, for example here are 3 legal label definitions:

label1:
label2:
a:

Label can be declared on a separate line or before any other instruction,


for example:

x1:MOV AX, 1
x2: MOV AX, 2

• Conditional Jumps

Unlike JMP instruction that does an unconditional jump, there are


instructions that do a conditional jumps (jump only when some
conditions are in act). These instructions are divided in three groups, first
group just test single flag, second compares numbers as signed, and third
compares numbers as unsigned.

1

Jump instructions that test single flag

Instruction Description Condition

JZ , JE Jump if Zero (Equal). ZF = 1

JB, JNA Jump if Carry (Below, Not Above Equal). CF = 1

JPE Jump if Parity Even. PF = 1

JNZ , JNE Jump if Not Zero (Not Equal). ZF = 0

JNC , JNB, JAE Jump if Not Carry (Not Below, Above Equal). CF = 0

JPO Jump if Parity Odd (No Parity). PF = 0

As you can see there are some instructions that do that same thing, that's correct,
they even are assembled into the same machine code, so it's good to remember
that when you compile JE instruction you will get it disassembled as:JZ
Different names are used to make programs easier to understand and code

• Jump instructions for signed numbers

Condition
Instruction Description

Jump if Equal (=).


JE , JZ ZF = 1
Jump if Zero.

Jump if Not Equal (<>).


JNE , JNZ ZF = 0
Jump if Not Zero.

Jump if Greater (>). ZF = 0 and


JG
Jump if Not Less or Equal (not <=). SF = OF

Jump if Less (<).


JL SF <> OF
Jump if Not Greater or Equal (not >=).

Jump if Greater or Equal (>=).


JGE , JNL SF = OF
Jump if Not Less (not <).

Jump if Not Greater (not >).


ZF = 1 or SF
Jump if Less or Equal (<=).
JLE , JNG <> OF
<> - sign means not equal.

•Jump instructions for unsigned numbers

2
Instruction Description Condition

Jump if Equal (=).


JE , JZ ZF = 1
Jump if Zero.

Jump if Not Equal (<>).


JNE , JNZ ZF = 0
Jump if Not Zero.

CF = 0
Jump if Above (>).
JA and
Jump if Not Below or Equal (not <=).
ZF = 0

Jump if Below (<).


JB , JC Jump if Not Above or Equal (not >=). CF = 1
Jump if Carry.

Jump if Above or Equal (>=).


JAE , JNB, JNC Jump if Not Below (not <). CF = 0
Jump if Not Carry.

CF = 1
Jump if Below or Equal (<=).
JBE , JNA or
Jump if Not Above (not >).
ZF = 1

Example:-

3
1. Write 8086 program that compares the element of AL with the element of
BL.if the two element are found to be equal save [FF] in memory location with
offset address RESULT otherwise save [00] into this location.

include emu8086.inc

ORG 100h

MOV AL, 25 ; set AL to 25.


MOV BL, 10 ; set BL to 10.

CMP AL, BL ; compare AL - BL.

JE equal ; jump if AL = BL (ZF = 1).

MOV RESULT,00
JMP stop ; jump to stop.

equal: ; if gets here,


MOV RESULT,FF

stop:

HLT

RESULT Db 33

• Try the above example with different numbers for AL and BL,
open flags by clicking on [FLAGS] button, use [Single Step] and see
what happens, don't forget to recompile and reload after every change
(use F5 shortcut).

• All conditional jumps have one big limitation, unlike JMP instruction they
can only jump 127 bytes forward and 128 bytes backward (note that most
instructions are assembled into 3 or more bytes).

We can easily avoid this limitation using a cute trick:

o Get a opposite conditional jump instruction from the table


above, make it jump to label_x.

o Use JMP instruction to jump to desired location.

o Define label_x: just after the JMP instruction.

label_x: - can be any valid label name.

4
Here is an example2:

include emu8086.inc

ORG 100h

MOV AL, 25 ; set AL to 25.


MOV BL, 10 ; set BL to 10.

CMP AL, BL ; compare AL - BL.

JNE not_equal ; jump if AL <> BL (ZF


= 0).
JMP equal
not_equal:

; let's assume that here we


; have a code that is assembled
; to more then 127 bytes...

MOV RESULT,00
JMP stop ; jump to stop.

equal: ; if gets here,


MOV RESULT,00
stop:

HLT
RESULT Db 33
END

5
Procedures:-
For each of the following exercises:
1-Write down the following program in the text editor and make # COM file.
2-Compile & emulate the program to its Hex code.
3-Compare between the assembled and disassembled programs.
4-Write down the machine instructions (Hex code) of the program
5-Use the single step execution command to run the program.
6-Verify the contents of the registers used in each instruction used in this
program including the IP in each step of the execution.

Exercises:

1- Determine the number of negative elements(msb=1) in block of data. the


length of the block is in memory location with offset address NUM and the
block itself start in memory location NUM1 store the number of negative
elements in memory location RESULT.

2- Find the largest element in the ARRAY of data contains 10 bytes unsigned
numbered. Store the maximum in the data segment memory location MAX
[ARRAY]= [5, 67, 70, 15, 12, E3, 77, 14, 8, 6]

3- Find the smallest element in the RECORD A store the minimum in the
memory location with offset address FOUND.
[RECORD A]= [FI, 1A, 28, 30, 4B, 89]

Anda mungkin juga menyukai