Assembly Language for Intel-Based
Computers, 4th Edition
Kip R. Irvine
Chapter 6: Conditional Processing
(c) Pearson Education, 2002. All rights reserved.
Chapter Overview
• Boolean and Comparison Instructions
• Conditional Jumps
• Conditional Loop Instructions
• Conditional Structures
• Application: Finite-State Machines
• Using the .IF Directive
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 2
Boolean and Comparison Instructions
• CPU Status Flags
• AND Instruction
• OR Instruction
• XOR Instruction
• NOT Instruction
• Applications
• TEST Instruction
• CMP Instruction
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 3
Status Flags - Review
• The Zero flag is set when the result of an operation equals
zero.
• The Carry flag is set when an instruction generates a
result that is too large (or too small) for the destination
operand.
• The Sign flag is set if the destination operand is negative,
and it is clear if the destination operand is positive.
• The Overflow flag is set when an instruction generates an
invalid signed result.
• Less important:
• The Parity flag is set when an instruction generates an even
number of 1 bits in the low byte of the destination operand.
• The Auxiliary Carry flag is set when an operation produces a carry
out from bit 3 to bit 4.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 4
AND Instruction
• Performs a Boolean AND operation between each
pair of matching bits in two operands
• Syntax:
AND destination, source
AND
(same operand types as MOV)
00111011
AND 0 0 0 0 1 1 1 1
cleared 00001011 unchanged
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 5
OR Instruction
• Performs a Boolean OR operation between each pair
of matching bits in two operands
• Syntax:
OR destination, source
OR
00111011
OR 0 0 0 0 1 1 1 1
unchanged 00111111 set
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 6
XOR Instruction
• Performs a Boolean exclusive-OR operation between
each pair of matching bits in two operands
• Syntax:
XOR destination, source XOR
00111011
XOR 0 0 0 0 1 1 1 1
unchanged 00110100 inverted
XOR is a useful way to toggle (invert) the bits in an operand.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 7
NOT Instruction
• Performs a Boolean NOT operation on a single
destination operand
• Syntax:
NOT destination NOT
NOT 00111011
11000100 inverted
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 8
Applications (1 of 5)
• Task: Convert the character in AL to upper case.
• Solution: Use the AND instruction to clear bit 5.
mov al,'a' ; AL = 01100001b
and al,11011111b ; AL = 01000001b
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 9
Applications (2 of 5)
• Task: Convert a binary decimal byte into its equivalent
ASCII decimal digit.
• Solution: Use the OR instruction to set bits 4 and 5.
mov al,6 ; AL = 00000110b
or al,00110000b ; AL = 00110110b
The ASCII digit '6' = 00110110b
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 10
Applications (3 of 5)
• Task: Turn on the keyboard CapsLock key
• Solution: Use the OR instruction to set bit 6 in the keyboard
flag byte at 0040:0017h in the BIOS data area.
mov ax,40h ; BIOS segment
mov ds,ax
mov bx,17h ; keyboard flag byte
or BYTE PTR [bx],01000000b ; CapsLock on
This code only runs in Real-address mode, and it does not
work under Windows NT, 2000, or XP.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 11
Applications (4 of 5)
• Task: Jump to a label if an integer is even.
• Solution: AND the lowest bit with a 1. If the result is Zero,
the number was even.
mov ax,wordVal
and ax,1 ; low bit set?
jz EvenValue ; jump if Zero flag set
JZ (jump if Zero) is covered in Section 6.3.
Your turn: Write code that jumps to a label if an integer is
negative.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 12
Applications (5 of 5)
• Task: Jump to a label if the value in AL is not zero.
• Solution: OR the byte with itself, then use the JNZ (jump
if not zero) instruction.
or al,al
jnz IsNotZero ; jump if not zero
ORing any number with itself does not change its value.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 13
TEST Instruction
• Performs a nondestructive AND operation between each pair of
matching bits in two operands
• No operands are modified, but the Zero flag is affected.
• Example: jump to a label if either bit 0 or bit 1 in AL is set.
test al,00000011b
jnz ValueFound
• Example: jump to a label if neither bit 0 nor bit 1 in AL is set.
test al,00000011b
jz ValueNotFound
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 14
CMP Instruction (1 of 3)
• Compares the destination operand to the source operand
• Nondestructive subtraction of source from destination (destination
operand is not changed)
• Syntax: CMP destination, source
• Example: destination == source
mov al,5
cmp al,5 ; Zero flag set
• Example: destination < source
mov al,4
cmp al,5 ; Carry flag set
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 15
CMP Instruction (2 of 3)
• Example: destination > source
mov al,6
cmp al,5 ; ZF = 0, CF = 0
(both the Zero and Carry flags are clear)
The comparisons shown so far were unsigned.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 16
CMP Instruction (3 of 3)
The comparisons shown here are performed with signed
integers.
• Example: destination > source
mov al,5
cmp al,-2 ; Sign flag == Overflow flag
• Example: destination < source
mov al,-1
cmp al,5 ; Sign flag != Overflow flag
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 17
Conditional Jumps
• Jumps Based On . . .
• Specific flags
• Equality
• Unsigned comparisons
• Signed Comparisons
• Applications
• Encrypting a String
• Bit Test (BT) Instruction
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 18
Jcond Instruction
• A conditional jump instruction branches to a label
when specific register or flag conditions are met
• Examples:
• JB, JC jump to a label if the Carry flag is set
• JE, JZ jump to a label if the Zero flag is set
• JS jumps to a label if the Sign flag is set
• JNE, JNZ jump to a label if the Zero flag is clear
• JECXZ jumps to a label if ECX equals 0
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 19
Jumps Based on Specific Flags
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 20
Jumps Based on Equality
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 21
Jumps Based on Unsigned Comparisons
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 22
Jumps Based on Signed Comparisons
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 23
Applications (1 of 5)
• Task: Jump to a label if unsigned EAX is greater than EBX
• Solution: Use CMP, followed by JA
cmp eax,ebx
ja Larger
• Task: Jump to a label if signed EAX is greater than EBX
• Solution: Use CMP, followed by JG
cmp eax,ebx
jg Greater
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 24
Applications (2 of 5)
• Jump to label L1 if unsigned EAX is less than or equal to Val1
cmp eax,Val1
jbe L1 ; below or equal
• Jump to label L1 if signed EAX is less than or equal to Val1
cmp eax,Val1
jle L1
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 25
Applications (3 of 5)
• Compare unsigned AX to BX, and copy the larger of the two
into a variable named Large
mov Large,bx
cmp ax,bx
jna Next
mov Large,ax
Next:
• Compare signed AX to BX, and copy the smaller of the two
into a variable named Small
mov Small,ax
cmp bx,ax
jnl Next
mov Small,bx
Next:
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 26
Applications (4 of 5)
• Jump to label L1 if the memory word pointed to by ESI equals
Zero
cmp WORD PTR [esi],0
je L1
• Jump to label L2 if the doubleword in memory pointed to by
EDI is even
test DWORD PTR [edi],1
jz L2
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 27
Applications (5 of 5)
• Task: Jump to label L1 if bits 0, 1, and 3 in AL are all set.
• Solution: Clear all bits except bits 0, 1,and 3. Then
compare the result with 00001011 binary.
and al,00001011b ; clear unwanted bits
cmp al,00001011b ; check remaining bits
je L1 ; all set? jump to L1
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 28
Your turn . . .
• Write code that jumps to label L1 if either bit 4, 5, or 6
is set in the BL register.
• Write code that jumps to label L1 if bits 4, 5, and 6
are all set in the BL register.
• Write code that jumps to label L2 if AL has even
parity.
• Write code that jumps to label L3 if EAX is negative.
• Write code that jumps to label L4 if the expression
(EBX – ECX) is greater than zero.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 29
Encrypting a String
The following loop uses the XOR instruction to transform every
character in a string into a new value.
KEY = 239
.data
buffer BYTE BUFMAX DUP(0)
bufSize DWORD ?
.code
mov ecx,bufSize ; loop counter
mov esi,0 ; index 0 in buffer
L1:
xor buffer[esi],KEY ; translate a byte
inc esi ; point to next byte
loop L1
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 30
String Encryption Program
• Tasks:
• Input a message (string) from the user
• Encrypt the message
• Display the encrypted message
• Decrypt the message
• Display the decrypted message
View the Encrypt.asm program's source code. Sample output:
Enter the plain text: Attack at dawn.
Cipher text: «¢¢Äîä-Ä¢-ïÄÿü-Gs
Decrypted: Attack at dawn.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 31
BT (Bit Test) Instruction
• Copies bit n from an operand into the Carry flag
• Syntax: BT bitBase, n
• bitBase may be r/m16 or r/m32
• n may be r16, r32, or imm8
• Example: jump to label L1 if bit 9 is set in the AX
register:
bt AX,9 ; CF = bit 9
jc L1 ; jump if Carry
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. 32