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