Assembly Language

advertisement
Jump
Condition
Topic
• Control Flow Structure
– Conditional Jump
– Unconditional Jump
• Control Flow Structures
– IF-THEN
– IF-THEN-ELSE
– CASE
• 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  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
ZF = 0 and SF = OF
Jump if Less than
Jump if Not Greater than or Equal to
Jump if less than or equal
Jump if not greater than
SF <> OF
JGE/JNL
JL/JNGE
JLE/JNG
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]
Until 4/11
Wrong jumps  wrong results!
[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:
Lets Jump to another lecture?
References
• Ch 6, Assembly Language Programming – by Charls Marut
• Some materials are from Dr. Sazzad, NSU
Download