Assembly Language

advertisement
Jump
Condition
Topic
• Control Flow Structure
– Conditional Jump
– Unconditional Jump
• Control Flow Structures
• Branches with Compound Conditions
An Example of Jump
Display the entire IBM character set
.MODEL SMALL
.CODE
.STARTUP
Statement
MOV
AH, 2
label
MOV
CX, 256
MOV
DL, 0
PRINT_LOOP:
INT
21H
INC
DL
DEC
CX
JNZ
PRINT_LOOP:
.EXIT
END
The function number
Calls system routine/functions
; display char function
; no. of chars to display
; DL has ASCII code for null char
; display a char
; increment ASCII code
; decrement counter
; keep going if CX not 0
Labels r needed
in cases
Section 6-1 of Assembly Language Programming Book
where one instruction
refers to another.
Conditional Jumps
JNZ
Syntax:
Jxxx
destination_label
• True or False [no gray area – like our minds!]
• JNZ is an example of conditional jump instruction
– Checks the Z flag. If Z = 0 then jump to the location
• Three categories of conditional jumps
– Signed jumps, for signed interpretation
– Unsigned jumps, for unsigned interpretation
– Single-flag jumps, operates on settings of individual flags
How to decide? Implement?
• CPU looks at the FLAGS register
• If jump conditions r TRUE – the CPU adjusts
the IP [instruction pointer 3.2.5] to point to the
destination_label,
• so that the instruction at this label will be
done next.
• If FALSE – no change in IP
1. Signed Conditional Jumps
Opcodes
Description
Condition for jumps
JG/JNLE
Jump if Greater than
Jump if Not Less than or Equal to
Jump if Greater than or Equal to
Jump if Not Less than
Jump if Less than
Jump if Not Greater than or Equal to
Jump if less than or equal
Jump if not greater than
ZF = 0 and SF = OF
JGE/JNL
JL/JNGE
JLE/JNG
SF = OF
SF <> OF
ZF = 1 or SF <> OF
2. Unsigned Conditional Jumps
Symbol
Description
Condition for jumps
JA/JNBE Jump if above
Jump if not below or equal
CF = 0 and ZF = 0
JAE/JNB Jump if above or equal
Jump if not below
CF = 0
JB/JNAE Jump if below
Jump if not above or equal
CF = 1
JBE/JNA Jump if below or equal
Jump if not above
CF = 1 or ZF = 1
3. Single-Flag Jumps
Symbol
Description
Condition for jumps
JE/JZ
Jump if equal
Jump if equal to zero
ZF = 1
JNE/JNZ Jump if not equal
Jump if not zero
ZF = 0
JC
Jump if carry
CF = 1
JNC
Jump if no carry
CF = 0
JO
Jump if overflow
OF = 1
JNO
Jump if no overflow
OF = 0
JS
Jump if sign negative
SF = 1
JNS
Jump if nonnegative sign
SF = 0
JP/JPE
Jump if parity even
PF = 1
JNP/JPO Jump if parity odd
PF = 0
ref
Range of a Conditional Jump
• The destination label must precede the Jump
instruction by no more than 126 bytes
• Or, follow by no more than 127 bytes
JZ
:
LABEL
126 bytes
; statement
; statement
JNZ
LABEL
127 bytes
LABEL
; statements
; statements
LABEL:
; statement
; statement
CMP Instruction
• The jump condition is often provided by the CMP
(compare) instruction
CMP
destination, source
 dest[contents] – source[contents]
• It is like SUB, except that destination is not changed
• Destination may not be a constant
• The result is not stored but the flags are affected
CMP
JG
AX, 10
BELOW
CMP
AX, BX
JG
BELOW
;JG – jump if >
If AX = 7FFFh, and BX = 0001h, the result is 7FFFh - 0001h = 7FFEh.
ZF = SF = OF = 0, JG is satisfied, so control transfers to label BELOW
Signed vs. Unsigned Jumps
• Each signed jump corresponds to an analogous
unsigned jump
– e.g., signed JG (if >) corresponds to unsigned JA (if above)
– Use depends on the interpretation
• The jumps operate on different flags
Symbol
Description
Condition for jumps
JG/JNLE
Jump if greater than
Jump if not less than or equal to
ZF = 0 and SF = OF
JA/JNBE Jump if above
Jump if not below or equal
Wrong jumps  wrong results!
CF = 0 and ZF = 0
[same as life]
Signed vs. Unsigned Jumps cont.
• For signed interpretation, let us take
– AX = 7FFFh, BX = 8000h and we execute
CMP
JA
AX, BX
BELOW_LABEL
• Even though 7FFFh > 8000h in a signed sense, the
program does not jump to BELOW_LABEL  why?
• Because 7FFFh < 8000h in an unsigned sense
• JA, which is the unsigned jump
Signed vs. Unsigned Jumps cont.
working with CHAR
• With standard ASCII character set [character
code 0-31 for control chars; 32-127 for
printable characters] – either signed/unsigned
jumps may be used.
• Why?
• Because the sign bit of a byte containing a
character code is always  zero [0].
• BUT, unsigned jumps should be used when
comparing extended ASCII characters [code
80h ~ FFh]
Extended ASCII codes (character code 128-255)
• There are several different variations of the 8-bit ASCII table. E.g.,
ISO 8859-1, also called ISO Latin-1. Codes 129-159 contain the
Microsoft® Windows Latin-1 extended characters.
http://www.ascii-code.com/
ref
The JMP Instruction
• JMP (jump) instruction causes an unconditional jump
• Syntax is:
JMP
destination/target_label
• JMP can be used to get around the range restriction [126/127 byte]
• Flags – no change
TOP:
TOP:
; body of the loop, say 2 instructions
DEC
CX
; decrement counter
JNZ
TOP
; keep looping if CX > 0
MOV
AX, BX
; the loop body contains so many instructions
; that label TOP is out of range for JNZ. Solution isDEC
CX
JNZ
BOTTOM
JMP
EXIT
BOTTOM:
JMP
TOP
EXIT:
MOV
AX, BX
Section 6-3: Assembly Language Programming
When CX=0
- It will not Jump to BOTTOM
- It will go to next instr. JMP EXIT
- JMP TOP  is unconditional – just Jump!
TOP:
; the loop body contains so many instructions
; that label TOP is out of range for JNZ.
Solution isDEC
CX
JNZ
BOTTOM
JMP
BOTTOM:
EXIT
JMP
TOP
MOV
AX, BX
EXIT:
References
• Ch 6, Assembly Language Programming – by Charls Marut
• Some materials are from Dr. Sazzad, NSU
Download