9-High-level language structures-ch6

advertisement
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
Download