COE 205 Lab Manual Lab 6: Conditional Processing - Page 56
COE 205 Lab Manual Lab 6: Conditional Processing - Page 56
Contents
6.1. Unconditional Jump
6.2. The Compare Instruction
6.3. Conditional Jump Instructions
6.4. Finding the Maximum of Three Integers
6.5. Implementing High-Level Control Structures
6.6. Conditional Loop Instructions
6.7. Linear Search of an Integer Array
6.8. Indirect Jump and the Switch Statement
L2:
. . .
jmp L1
. . .
L1:
. . .
jmp L2
The Overflow, Carry, Sign, and Zero flags are updated as if the subtract instruction has been
performed. The main purpose of the compare instruction is to update the flags so that a
subsequent conditional jump instruction can test them.
.686
.MODEL flat, stdcall
.STACK
INCLUDE Irvine32.inc
.data
var1 SDWORD -3056
.code
main PROC
mov eax, 0f7893478h
mov ebx, 1234F678h
cmp al, bl
cmp ax, bx
cmp eax, ebx
cmp eax, var1
exit
main ENDP
END main
Carry the execution of the compare instructions manually by doing subtraction by hand.
Guess the values of the flags and write them in the specified boxes.
cmp al, bl OF = CF = SF = ZF =
cmp ax, bx OF = CF = SF = ZF =
cmp eax, ebx OF = CF = SF = ZF =
cmp eax, var1 OF = CF = SF = ZF =
The following is a list of jumps based on the Zero, Carry, Overflow, Sign, and Parity flags.
Mnemonic Description Flags
JZ, JE Jump if Zero, Jump if Equal ZF = 1
JNZ, JNE Jump if Not Zero, Jump if Not Equal 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 Signed (Negative) SF = 1
JNS Jump if Not Signed (Positive or Zero) SF = 0
JP, JPE Jump if Parity, Jump if Parity is Even PF = 1
JNP, JPO Jump if Not Parity, Jump if Parity is Odd PF = 0
The following table shows the jumps based on the value of CX and ECX:
Mnemonic Description
JCXZ Jump if CX = 0
JECXZ Jump if ECX = 0
The following table shows a list of signed jumps based on comparisons of signed operands:
Mnemonic Description Condition Tested
JG, JNLE Jump if Greater, Jump if Not Less or Equal ZF = 0 and SF = OF
JGE, JNL Jump if Greater or Equal, Jump if Not Less SF = OF
JL, JNGE Jump if Less, Jump if Not Greater or Equal SF ≠ OF
JLE, JNG Jump if Less or Equal, Jump if Not Greater ZF = 1 or SF ≠ OF
The following shows a list of unsigned jumps based on comparisons of unsigned operands:
Mnemonic Description Condition Tested
JA, JNBE Jump if Above, Jump if Not Below or Equal ZF = 0 and CF = 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 ZF = 1 or CF = 1
.data
var1 DWORD -30 ; Equal to FFFFFFE2 (hex)
var2 DWORD 12
var3 DWORD 7
max1 BYTE "Maximum Signed Integer = ",0
max2 BYTE "Maximum Unsigned Integer = ",0
.code
main PROC
; Finding Signed Maximum
mov eax, var1
cmp eax, var2
jge L1
mov eax, var2
L1:
cmp eax, var3
jge L2
mov eax, var3
L2:
lea edx, max1
call WriteString
call WriteInt
call Crlf
exit
main ENDP
END main
Console Output
Place the cursor at the beginning of the main procedure and press F7. Now step through the
program by pressing F10 and watch the changes in the eax register. Observe when
conditional branches are taken (or not taken). Check the console output that you wrote, make
the correction, and try to understand your mistakes.
mov eax, a
// Two-Way Selection cmp eax, b
if (a <= b) jg else_part
{ . . . } // if part . . . ; if part
else jmp end_if
{ . . . } // else part else_part:
. . . ; else part
end_if:
mov eax, a
cmp eax, b
// Short-Circuit AND jle end_if
if (a > b && a == c) { . . . } cmp eax, c
jne end_if
. . . ; if part
end_if:
mov eax, a
cmp eax, b
jg if_part
// Short-Circuit OR cmp eax, c
if (a > b || a == c ) { . . . } jne end_if
if_part:
. . . ; if part
end_if:
jmp bool_expr
while_body:
// Second Translation . . . ; while body
while (a > b) { . . . } bool_expr:
mov eax, a
cmp eax, b
jgt while_body
end_while:
In the first translation, the Boolean expression is placed before the loop body, whereas in the
second translation, it is placed after the loop body. Both translations are correct, but the
second translation is slightly better than the first one. The first translation has one forward
conditional jump and one backward unconditional jump, which are executed for each loop
iteration, while the second translation has only one conditional backward jump. The forward
unconditional jump at the beginning of the second translation is done once.
while (a <= b) {
a++;
if (b == c)
a = a + b
else {
b = b - a
c--;
}
}
.686
.MODEL flat, stdcall
.STACK
INCLUDE Irvine32.inc
.data
; First element is at index 0
intArray SDWORD 18,20,35,-12,66,4,-7,100,15
item SDWORD -12
FoundStr BYTE " is found at index ", 0
NotFoundStr BYTE " is not found", 0
.code
main PROC
mov ecx, LENGTHOF intArray ; loop counter
mov eax, item ; item to search
mov esi, -1 ; index to intArray
L1:
inc esi ; increment index before search
cmp intArray[4*esi], eax ; compare array element with item
loopnz L1 ; loop as long as item not found
jne notFound ; item not found
found:
call WriteInt ; write item
mov edx, OFFSET FoundStr
call WriteString ; " is found at index "
mov eax, esi
call WriteDec ; Write index
jmp quit
notFound:
call WriteInt ; write item
mov edx, OFFSET NotFoundStr
call WriteString ; " is not found"
quit:
call Crlf
exit
main ENDP
END main
Study the above program and write the Console Output in the specified box.
Console Output
Repeat the above process but with item equal to -10. Write the Console Output in the box
shown below.
.686
.MODEL flat, stdcall
.STACK
INCLUDE Irvine32.inc
.data
value SDWORD 0
valuestr BYTE "Value = ",0
prompt BYTE "Enter Selection [Quit=0,Inc=1,Dec=2,Add5=3,Sub5=4]: ",0
.code
main PROC
; Start at break to bypass the jump table
jmp break
case3:
add value, 5
jmp break
case4:
sub value, 5
jmp break
break:
; Display value
mov edx, OFFSET valuestr
call WriteString
mov eax, value
call WriteInt
call Crlf
Console Output
Review Questions
Programming Exercises
1. Write a program that uses a loop to input signed 32-bit integers from the user and
computes and displays their minimum and maximum values. The program terminates
when the user enters an invalid input.
2. Using the following table as a guide, write a program that asks the user to enter an integer
test score between 0 and 100. The program should display the appropriate letter grade.
The program should display an error message if the test score is <0 or >100.
90 to 100 85 to 89 80 to 84 75 to 79 70 to 74 65 to 70 60 to 64 55 to 59 0 to 54
A+ A B+ B C+ C D+ D F
3. Write a program that reads a single character ‘0’ to ‘9’, ‘A’ to ‘F’, or ‘a’ to ‘f’, and then
converts it and displays it as a number between 0 and 15. Use the ReadChar procedure to
read the character. Do not use the ReadHex procedure. Display an error message if the
input character is invalid.
5. Write a program that reads a string of up to 50 characters and stores it in an array. It then
asks the user to input a single character and matches this character against all occurrences
in the string. Each matched character in the string should be converted into a blank.
6. Write a program that inputs an unsigned integer sum > 1, and then computes and displays
the smallest integer n, such that 1 + 2 +…+ n > sum. An error message should be
displayed if the input sum ≤ 1.