Assembly Language for Intel
Assembly Language for Intel - - Based Based Computers, 4
Computers, 4 th th Edition Edition
Chapter 6: Conditional Processing
Kip R. Irvine
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
2
Chapter Overview Chapter Overview
• Boolean and Comparison Instructions
• Conditional Jumps
• Conditional Loop Instructions
• Conditional Structures
• Application: Finite-State Machines
• Using the .IF Directive
Boolean and Comparison Instructions 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.
4
Status Flags
Status Flags - - Review 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.
AND Instruction AND Instruction
• Performs a Boolean AND operation between each pair of matching bits in two operands
• Syntax:
AND destination, source
(same operand types as MOV)
0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1
AND
unchanged cleared
AND
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
6
OR Instruction OR Instruction
• Performs a Boolean OR operation between each pair of matching bits in two operands
• Syntax:
OR destination, source
OR
0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1
OR
set
unchanged
XOR Instruction XOR Instruction
• Performs a Boolean exclusive-OR operation between each pair of matching bits in two operands
• Syntax:
XOR destination, source XOR
0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 0 0
XOR
inverted unchanged
XOR is a useful way to toggle (invert) the bits in an operand.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
8
NOT Instruction NOT Instruction
• Performs a Boolean NOT operation on a single destination operand
• Syntax:
NOT destination NOT
0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 0
NOT
inverted
Applications
Applications (1 of 5) (1 of 5)
mov al,'a' ; AL = 01100001b
and al,11011111b ; AL = 01000001b
• Task: Convert the character in AL to upper case.
• Solution: Use the AND instruction to clear bit 5.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
10
Applications
Applications (2 of 5) (2 of 5)
mov al,6 ; AL = 00000110b
or al,00110000b ; AL = 00110110b
• Task: Convert a binary decimal byte into its equivalent ASCII decimal digit.
• Solution: Use the OR instruction to set bits 4 and 5.
The ASCII digit '6' = 00110110b
Applications
Applications (3 of 5) (3 of 5)
mov ax,40h ; BIOS segment
mov ds,ax
mov bx,17h ; keyboard flag byte
or BYTE PTR [bx],01000000b ; CapsLock on
• 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.
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.
12
Applications
Applications (4 of 5) (4 of 5)
mov ax,wordVal
and ax,1 ; low bit set?
jz EvenValue ; jump if Zero flag set
• 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.
JZ (jump if Zero) is covered in Section 6.3.
Your turn: Write code that jumps to a label if an integer is
negative.
Applications
Applications (5 of 5) (5 of 5)
or al,al
jnz IsNotZero ; jump if not zero
• 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.
ORing any number with itself does not change its value.
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
14
TEST Instruction 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
CMP Instruction
CMP Instruction (1 of 3) (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.
16
CMP Instruction
CMP Instruction (2 of 3) (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.
CMP Instruction
CMP Instruction (3 of 3) (3 of 3)
• Example: destination > source
mov al,5
cmp al,-2 ; Sign flag == Overflow flag
The comparisons shown here are performed with signed integers.
• Example: destination < source mov al,-1
cmp al,5 ; Sign flag != Overflow flag
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
18
Conditional Jumps Conditional Jumps
• Jumps Based On . . .
• Specific flags
• Equality
• Unsigned comparisons
• Signed Comparisons
• Applications
• Encrypting a String
• Bit Test (BT) Instruction
J J cond cond Instruction 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.
20
Jumps Based on Specific Flags
Jumps Based on Specific Flags
Jumps Based on Equality
Jumps Based on Equality
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
22
Jumps Based on Unsigned Comparisons
Jumps Based on Unsigned Comparisons
Jumps Based on Signed Comparisons
Jumps Based on Signed Comparisons
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
24
Applications
Applications (1 of 5) (1 of 5)
cmp eax,ebx ja Larger
• Task: Jump to a label if unsigned EAX is greater than EBX
• Solution: Use CMP, followed by JA
cmp eax,ebx jg Greater
• Task: Jump to a label if signed EAX is greater than EBX
• Solution: Use CMP, followed by JG
Applications
Applications (2 of 5) (2 of 5)
cmp eax,Val1
jbe L1 ; below or equal
• Jump to label L1 if unsigned EAX is less than or equal to Val1
cmp eax,Val1 jle L1
• Jump to label L1 if signed EAX is less than or equal to Val1
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
26
Applications
Applications (3 of 5) (3 of 5)
mov Large,bx cmp ax,bx jna Next
mov Large,ax Next:
• Compare unsigned AX to BX, and copy the larger of the two into a variable named Large
mov Small,ax cmp bx,ax jnl Next
mov Small,bx Next:
• Compare signed AX to BX, and copy the smaller of the two
into a variable named Small
Applications
Applications (4 of 5) (4 of 5)
cmp WORD PTR [esi],0 je L1
• Jump to label L1 if the memory word pointed to by ESI equals Zero
test DWORD PTR [edi],1 jz L2
• Jump to label L2 if the doubleword in memory pointed to by
EDI is even
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.
28
Applications
Applications (5 of 5) (5 of 5)
and al,00001011b ; clear unwanted bits cmp al,00001011b ; check remaining bits
je L1 ; all set? jump to L1
• 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.
Your turn . . . 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.
30
Encrypting a String Encrypting a String
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
The following loop uses the XOR instruction to transform every
character in a string into a new value.
String Encryption Program 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
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003.