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