High-level language structures 13/04/2015 CAP221 1 Branching structures IF-THEN • IF condition is true THEN execute true-branch statements End_if 13/04/2015 CAP221 2 Branching structures IF-THEN false condition true True branch statements 13/04/2015 CAP221 3 example • Replace the number in AX by its absolute value. • Pseudo code algorithm is IF AX <0 Then replace AX by –AX END_IF 13/04/2015 CAP221 4 example • Code: CMP AX,0 JNL END_IF ;AX<0? ;no, exit , JGE NEG AX ;yes, change sign END_IF: 13/04/2015 CAP221 5 IF_THEN_ELSE • IF condition is true THEN execute true-branch statements ELSE execute FALSE-branch statements End_IF 13/04/2015 CAP221 6 IF_THEN_ELSE FALSE TRUE CONDITION FALSE BRANCH STATEMENTS 13/04/2015 TRUE BRANCH STATEMENTS CAP221 7 EXAMPLE • Suppose AL and BL contains extended ASCII characters. Display the one that comes first in the character sequence. 13/04/2015 CAP221 8 example • Pseudo code algorithm is IF AL < BL THEN display the char in AL ELSE display the char in BL END_IF 13/04/2015 CAP221 9 EXAMPLE Code: MOV AH,2 CMP AL,BL JA ELSE_ MOV DL,AL JMP DISPLAY 13/04/2015 ELSE_: MOV DL,BL DISPLAY: INT 21H CAP221 10 • We use the unsigned jump because we are comparing extended characters. • JMP (unconditional jump) is needed to skip the false branch. 13/04/2015 CAP221 11 CASE • A case is a multiway branch structure that tests a register, variable, or expression for particular values or range of values. The general form is as follows: case expression values_1: statements_1 values_2: statements_2 ………….. values_n: statements_n END_CASE 13/04/2015 CAP221 12 CASE EXPRESSION VALUE_1 STATEMENTS_1 13/04/2015 VALUE_2 STATEMENTS_2 CAP221 ……. VALUE_N STATEMENTS_N 13 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. 13/04/2015 CAP221 14 example • Pseudo code algorithm is Case AX < 0:put -1 in BX = 0:put 0 in BX > 0:put 1 in BX END_CASE 13/04/2015 CAP221 15 Code: CMP AX,0 JL NEGATIVE JE ZERO JG POSITIVE NEGATIVE: MOV BX,-1 JMP END_CASE Example ZERO: MOV BX,0 JMP END_CASE POSITIVE: MOV BX,1 END_CASE •NOTE: only one CMP is needed, because jump instructions do not affect the flags. 13/04/2015 CAP221 16 example • If AL contains 1 or 3, display “o”; if AL contains 2 or 4, display “e”. • Pseudo code algorithm is • Case AL 1, 3: display “o” 2, 4: display “e” End_case 13/04/2015 CAP221 17 example Code: CMP AL,1 JE ODD CMP AL,3 JE ODD CMP AL,2 JE EVEN CMP AL,4 JE EVEN JMP END_ 13/04/2015 ODD: MOV DL, ’o’ JMP DIS_ EVEN: MOV DL, ’e’ DIS_: MOV AH,2 INT 21H END_: CAP221 18 Branches with compound conditions • Sometimes the branching condition in an IF or CASE takes the form • Condition_1 and condition_2 • Condition_1 or condition_2 13/04/2015 CAP221 19 AND conditions • An AND condition is true if and only if condition_1 and condition_2 are both true. • Likewise, if either condition is false, then the whole thing is false. 13/04/2015 CAP221 20 Example • Read a character, and if it’s an uppercase letter, display it. • Pseudo code algorithm is read a character (into AL) If (‘A’ <= character) and (character <=‘Z’) Then Display character End_if 13/04/2015 CAP221 21 example • Code: MOV ah,1 INT 21h CMP al,’A’ JL end_if CMP al,’Z’ JG end_if 13/04/2015 MOV DL,AL MOV AH,2 INT 21H End_if: CAP221 22 OR conditions • condition_1 OR condition_2 is true if at least one of the conditions is true. • if both conditions are false, then the whole thing is false. 13/04/2015 CAP221 23 example • Read a character. If it’s “y” or “Y”, display it; otherwise, terminate the program. • Pseudo code algorithm is Read a character (into AL) if (character = “y” or character= “Y”) Then Display character Else Terminate the program End_if 13/04/2015 CAP221 24 example MOV AH,1 INT 21h CMP AL, ’y’ JE THEN CMP AL,’Y’ JE THEN JMP ELSE_ 13/04/2015 THEN: MOV AH,2 MOV DL,AL INT 21H JMP END_IF ELSE_: MOV AH,4CH INT 21H END_IF: CAP221 25 Looping structures • A loop is a sequence of instructions that are repeated. • For loop: this is a loop structure in which the loop statements are repeated a known number of times (a count-controlled loop). 13/04/2015 CAP221 26 Initialize count For loop_count times do statements end_for statements Count = count - 1 False Count=0 True 13/04/2015 CAP221 27 LOOP instruction • The LOOP instruction can be used to implement a FOR loop. • General form: LOOP des_label The counter for the loop is the register CX. 13/04/2015 CAP221 28 LOOP instruction • CX is initialized to loop_count. • Execution of the LOOP instruction causes CX to be decremented automatically. • If CX is not 0, control transfers to des_label. • If CX =0, the next instruction after LOOP is done. • Des_label must precede the LOOP instruction by no more than 126 bytes. 13/04/2015 CAP221 29 LOOP instruction • So, a FOR loop can be implemented as follows. ; initialize CX to loop_count Des_label: ; body of the loop loop des_label 13/04/2015 CAP221 30 example • Write a count-controlled loop to display a row of 80 stars. • Pseudo code algorithm is For 80 times do display ‘*’ end_for 13/04/2015 CAP221 31 example MOV CX,80 MOV AH,2 MOV DL,’*’ TOP: INT 21H LOOP TOP 13/04/2015 CAP221 32 LOOP instruction • A loop instruction is executed at least once. • If CX = 0 when the loop is entered, the loop instruction causes CX to be decremented to FFFFH. • So, the loop is executed 65535 more times. 13/04/2015 CAP221 33 LOOP instruction • Solution: use the instruction JCXZ (jump if CX is zero) before the loop. JCXZ des_label 13/04/2015 CAP221 34 LOOP instruction • A loop implemented as follows is bypassed if CX is 0. JCXZ skip top: ;body of the loop loop top Skip: 13/04/2015 CAP221 35 While Loop • This loop depends on a condition. • Pseudo code while condition do statements end_while 13/04/2015 CAP221 36 While Loop True condition False statements 13/04/2015 CAP221 37 example • Write some code to count the number of characters in an input line. • Pseudo code initialize count to 0. read a character while character <> carriage_return do count=count + 1 read a character end_while 13/04/2015 CAP221 38 example MOV DX,0 ; or bx, cx, ax?? MOV AH,1 INT 21H WHILE_: CMP AL,0DH JE END_ INC DX INT 21H JMP WHILE_ END_ : 13/04/2015 CAP221 39 Repeat loop • Another conditional loop is the repeat loop. Pseudo code repeat statements until condition 13/04/2015 CAP221 40 Repeat loop statements False condition True 13/04/2015 CAP221 41 example • Write some code to read characters until a blank is read. Pseudo code Repeat read a character until character is a blank 13/04/2015 CAP221 42 example MOV AH,1 REPEAT: INT 21H CMP AL,’ ’ JNE REPEAT 13/04/2015 CAP221 43 WHILE versus REPEAT • In a while loop, the loop can be bypassed if the terminating condition is initially false. • The statements in a repeat must be done at least once. • Code for a repeat loop is likely to be shorter because there is only a conditional jump at the end, but a while loop has two jumps: a conditional jump at the top and a jmp at the bottom. 13/04/2015 CAP221 44 Programming with high-level structures • Top-down program design: The original problem is solved by solving a series of sub problems, each of which is easier to solve than the original problem. 13/04/2015 CAP221 45 example Prompt the user to enter a line of text. On the next line, display the capital letter entered that comes first alphabetically and the one that comes last. If no capital letters are entered, display “No capital letter”. sample execution: type a line of text: THE QUICK BROWN FOX JUMPED. first capital = B last capital = X 13/04/2015 CAP221 46 Top down program design First refinement: 1. Display the opening message. 2. Read and process a line of text. 3. Display the results. 13/04/2015 CAP221 47 example TITLE PGM6_2 : FIRST LAST CAPITALS .MODEL SMALL .STACK 100H .DATA PROMPT DB 'Type a line of text ',0dH,0AH,'$' NOCAP_MSG DB 0DH,0AH,' No Capitals $' CAP_MSG DB 0DH,0AH,'FIRST CAPITAL = ' FIRST DB '[' DB ' LAST CAPITAL = ' LAST DB '@ $' 13/04/2015 CAP221 48 Step 1 .CODE MAIN PROC ; initialize DS MOV AX,@DATA MOV DS, AX ; first step display opening message MOV AH,9 LEA DX,PROMPT INT 21H 13/04/2015 CAP221 49 Step 2: read and process a line of text Read a character. While character is not a carriage return do If character is a capital letter Then If character precedes first capital Then First capital = character End_if If character follows last capital Then Last capital = character End_if End_if Read a character End_while 13/04/2015 CAP221 50 ;read and process a line of text MOV AH,1 INT 21H WHILE_: ; while character is not carriage ;return do CMP AL,0dH JE END_WHILE ; if character is a capital letter CMP AL,'A' JNGE END_IF CMP AL,'Z' JNLE END_IF ; then ; if character precedes FIRST ;capital CMP AL,FIRST JNL CHECK_LAST 13/04/2015 ; then FIRST CAPITAL = ;character MOV FIRST,AL ; end_if CHECK_LAST : ; if character follows last capital CMP AL,LAST JNG END_IF ; then LAST CAPITAL = character MOV LAST,AL ;end_if END_IF: ; read a character INT 21H JMP WHILE_ END_WHILE : CAP221 51 Step 3: display the results if no capitals were typed then display “no capitals” Else display first capital and last capital End_if 13/04/2015 CAP221 52 ; display results MOV AH,9 ; if no capital were typed CMP FIRST, '[' JNE CAPS ; then LEA DX,NOCAP_MSG JMP DISPLAY CAPS : LEA DX,CAP_MSG DISPLAY : INT 21H ;end_if ; DOS exit MOV AH,4CH INT 21H MAIN ENDP END MAIN 13/04/2015 CAP221 53