Assembly Language for Intel 8086 Jump Condition Ch
Assembly Language for Intel 8086 Jump Condition Ch 6, Assembly Language Programming – by Charls Marut Some materials are from Dr. Sazzad, NSU
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 21 H 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 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 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 LABEL 126 bytes : JZ ; statement JNZ LABEL 127 bytes LABEL: LABEL ; statements ; 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 = 7 FFFh, and BX = 0001 h, the result is 7 FFFh - 0001 h = 7 FFEh. 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 = 7 FFFh, BX = 8000 h and we execute CMP JA AX, BX BELOW_LABEL • Even though 7 FFFh > 8000 h in a signed sense, the program does not jump to BELOW_LABEL why? • Because 7 FFFh < 8000 h 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 80 h ~ 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: ; 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 is. DEC 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 is. DEC CX JNZ BOTTOM JMP BOTTOM: EXIT JMP TOP MOV AX, BX
Assembly Lang. – Intel 8086… • Control Flow Structure – Conditional Jump – Unconditional Jump • Control Flow Structures – IF-THEN-ELSE – CASE • Branches with Compound Conditions Many materials are from Dr. Sazzad, NSU Ch 6, Assembly Language Programming – by Charls Marut Section 4 -3 of Intel Microprocessors – by Brey
IF-THEN Structure Replace the number in AX by its absolute value. IF AX < 0 THEN replace AX by –AX END_IF: CMP JNL NEG AX, 0 ; AX < 0? END_IF ; jump if Not Less than AX Example 6 -2: Assembly Language Programming
IF-THEN-ELSE Structure Suppose AL and BL contains ASCII characters. Display the one that comes first in the character sequence IF AL <= BL THEN display the character in AL ELSE display the character in BL END_ID ELSE_: DISPLAY: END_IF: MOV CMP JNBE AH, 2 AL, BL ELSE_ MOV JMP DL, AL DISPLAY MOV DL, BL INT 21 h ; prepare to display ; AL <= BL? ; jump if Not Below/Equal Example 6 -3: Assembly Language Programming
CASE • A CASE is a multi-way branch structure CASE expression 1: statements_1 2: statements_2 * * n: statements_n END_CASE
CASE Example If AX contains a negative number, put -1 in BX; If AX contains 0, put 0 in BX; If AX contains a positive number, put 1 in BX. CMP JL JE JG NEGATIVE: MOV JMP ZERO: MOV JMP POSITIVE: MOV END_CASE: AX, 0 NEGATIVE ZERO POSITIVE ; test AX ; AX < 0 ; AX = 0 ; AX > 0 BX, -1 END_CASE ; put -1 in BX ; and exit BX, 0 END_CASE ; put 0 in BX ; and exit BX, 1 ; put 1 in BX Example 6 -4: Assembly Language Programming CASE AX < 0: put -1 in BX = 0: put 0 in BX > 0: put 1 in BX END_CASE JL – Jump if less than JE – if equal JG – if greater than
More CASE Example If AL contains 1 or 3, display “o” for odd; If AL contains 2 or 4, display “e” for even; CMP AL, 1 ; AL = 1? JE ODD ; yes, display ‘o’ CMP AL, 3 ; AL = 3? JE ODD ; yes, display ‘o’ CMP AL, 2 ; AL = 2? JE EVEN ; yes, display ‘e’ CMP AL, 4 ; AL = 4? JE EVEN ; yes, display ‘e’ JMP END_CASE ODD: MOV DL, ‘o’ ; get ‘o’ JMP DISPLAY ; go to display EVEN: MOV DL, ‘e’ ; get ‘e’ DISPLAY: MOV AH, 2 ; char display function INT 21 h ; display character END_CASE Example 6 -4: Assembly Language Programming CASE AL 1, 3: display ‘o’ 2, 4: display ‘e’ END_CASE JE – if equal
Agenda • Control Flow Structure – Conditional Jump – Unconditional Jump • Control Flow Structures – IF-THEN-ELSE – CASE • Branches with Compound Conditions
Branches with Compound Conditions • Branching condition in an IF or CASE can be or, condition_1 AND condition_2 condition_1 OR condition_2 • First one is AND condition • Second one is OR condition
AND Conditions Read a character, and if it’s an uppercase letter, display it. Read a character into AL IF (‘A’ <= character ) and (character <= ‘Z’) THEN display the character END_IF: MOV INT AH, 1 21 h ; read character function ; char in AL CMP JNGE AL, ‘A’ END_IF ; char >= ‘A’ ; no, exit jump if Not Greater Than or Equal to CMP JNLE AL, ‘Z’ END_IF ; char <= ‘Z’ ; no, exit jump if Not Less Than or Equal to MOV DL, AL ; get char MOV INT AH, 2 21 h ; display character function ; display the character Example 6 -6: Assembly Language Programming
OR Conditions Read a character, and if it’s ‘y’ or ‘Y’, display it; otherwise, terminate the program Read a character into AL IF (character = ‘y’) or (character = ‘Y’) THEN display the character ELSE terminate the program END_IF THEN: ELSE_: MOV INT AH, 1 21 h ; read character function ; char in AL CMP JE JMP AL, ‘Y’ THEN AL, ‘y’ THEN ELSE_ ; char = ‘Y’ ; yes, display the char ; char = ‘y’ ; yes, display the char MOV INT DL, AL AH, 2 21 h ; get the char ; display character function ; display the character Example 6 -7: Assembly Language Programming JE – if equal
Topics – 6. 4. 2 • Control Flow Structures – FOR Loop – WHILE Loop – REPEAT-UNTIL Loop • Load Effective Address (LEA) Instruction • Programming with Higher Level Structures
C – loops • for • While • do while for (Start value; end condition; increase value) statement; int main() { int i; for (i = 0; i < 10; i++) { } return 0; } printf ("Hellon"); printf ("Worldn");
C – while int main() { int counter, howmuch; scanf("%d", &howmuch); counter = 0; while ( counter < howmuch) { } } return 0; counter++; printf("%dn", counter);
C – do while do { do something; } while (expression); int main() { int counter, howmuch; scanf("%d", &howmuch); counter = 0; do { } counter++; printf("%dn", counter); while ( counter < howmuch); } return 0;
LOOP Instruction: LOOP destination_label - Counter for LOOP is CX register, which is initialized to loop_count - CX decreases automatically - If CX is NOT 0 control transfers to destination_label - If CX = 0, the next instruction after the LOOP is done.
Assembly - FOR Loop Write a program to display a row of 80 stars ‘*’ FOR 80 times DO display ‘*’ END_FOR MOV MOV CX, 80 ; number of ‘*’ to display AH, 2 ; char display function DL, ‘*’ ; char to display INT 21 h TOP: LOOP TOP ; display a star ; repeat 80 times Example 6 -8: Assembly Language Programming
WHILE Loop Write a program to count the characters in an input line Initialize count to 0 Read a character WHILE character <> carriage_return DO count = count + 1 read a character END_WHILE MOV INT DX, 0 AH, 1 21 h ; DX counts the characters ; read char function ; read a char in AL WHILE_: CMP JE INC INT JMP END_WHILE: AL, 0 DH ; CR? END_WHILE DX 21 h WHILE_ Example 6 -9: Assembly Language Programming WHILE condition DO statements END_WHILE
REPEAT Loop REPEAT statements Write a program to read characters until a blank/space is read UNTIL condition REPEAT read a character UNTIL character is a blank MOV REPEAT: INT CMP JNE AH, 1 ; read char function 21 h ; read a char in AL AL, ‘ ‘ ; a blank? REPEAT ; no, keep reading Example 6 -10: Assembly Language Programming
- Slides: 35