Chapter 7 P4
Chapter 7 P4
Computer Organization
&
Assembly Language Programming
Dr Adnan Gutub
aagutub ‘at’ uqu.edu.sa
[Adapted from slides of Dr. Kip Irvine: Assembly Language for Intel-Based Computers]
Most Slides contents have been arranged by Dr Muhamed Mudawar & Dr Aiman El-Maleh from Computer Engineering Dept. at KFUPM
Outline
Shift and Rotate Instructions
Shift and Rotate Applications
Multiplication and Division Instructions
Translating Arithmetic Expressions
Decimal String to Number Conversions
1
SHL Instruction
SHL is the Shift Left instruction
Performs a logical left shift on the destination operand
Fills the lowest bit with zero
The last bit shifted out from the left becomes the Carry Flag
0
CF
Fast Multiplication
Shifting left 1 bit multiplies a number by 2
2
SHR Instruction
SHR is the Shift Right instruction
Performs a logical right shift on the destination operand
The highest bit position is filled with a zero
The last bit shifted out from the right becomes the Carry Flag
SHR uses the same instruction format as SHL
0
CF
0
CF
Arithmetic Shift
Fills the newly created bit position with a copy of the sign bit
Applies only to Shift Arithmetic Right (SAR)
CF
3
SAL and SAR Instructions
SAL: Shift Arithmetic Left is identical to SHL
SAR: Shift Arithmetic Right
Performs a right arithmetic shift on the destination operand
CF
Your Turn . . .
Indicate the value of AL and CF after each shift
4
Effect of Shift Instructions on Flags
The CF is the last bit shifted
The OF is defined for single bit shift only
It is 1 if the sign bit changes
The ZF, SF and PF are affected according to the result
The AF is unaffected
ROL Instruction
ROL is the Rotate Left instruction
Rotates each bit to the left, according to the count operand
Highest bit is copied into the Carry Flag and into the Lowest Bit
CF
mov al,11110000b
rol al,1 ; AL = 11100001b, CF = 1
mov dl,3Fh ; DL = 00111111b
rol dl,4 ; DL = 11110011b = F3h, CF = 1
5
ROR Instruction
ROR is the Rotate Right instruction
Rotates each bit to the right, according to the count operand
Lowest bit is copied into the Carry flag and into the highest bit
CF
mov al,11110000b
ror al,1 ; AL = 01111000b, CF = 0
mov dl,3Fh ; DL = 00111111b
ror dl,4 ; DL = F3h, CF = 1
RCL Instruction
RCL is the Rotate Carry Left instruction
Rotates each bit to the left, according to the count operand
Copies the Carry flag to the least significant bit
Copies the most significant bit to the Carry flag
As if the carry flag is part of the destination operand
CF
6
RCR Instruction
RCR is the Rotate Carry Right instruction
Rotates each bit to the right, according to the count operand
Copies the Carry flag to the most significant bit
Copies the least significant bit to the Carry flag
As if the carry flag is part of the destination operand
CF
7
SHLD Instruction
SHLD is the Shift Left Double instruction
Syntax: SHLD destination, source, count
Shifts a destination operand a given count of bits to the left
SHLD Example
Shift variable var1 4 bits to the left
Replace the lowest 4 bits of var1 with the high 4 bits of AX
.data var1 AX
var1 WORD 9BA6h
.code Before: 9BA6 AC36
mov ax, 0AC36h After: BA6A AC36
shld var1, ax, 4
8
SHRD Instruction
SHRD is the Shift Right Double instruction
Syntax: SHRD destination, source, count
Shifts a destination operand a given count of bits to the right
SHRD Example
Shift AX 4 bits to the right
Replace the highest 4 bits of AX with the low 4 bits of DX
DX AX
mov ax,234Bh
mov dx,7654h
Before: 7654 234B
9
Your Turn . . .
Indicate the values (in hex) of each destination operand
mov ax,7C36h
mov dx,9FA6h
shld dx,ax,4 ; DX = FA67h
shrd ax,dx,8 ; AX = 677Ch
Next . . .
Shift and Rotate Instructions
Shift and Rotate Applications
Multiplication and Division Instructions
Translating Arithmetic Expressions
Decimal String to Number Conversions
10
Shifting Bits within an Array
Sometimes, we need to shift all bits within an array
Example: moving a bitmapped image from one screen to another
.data
ArraySize EQU 100
array BYTE ArraySize DUP(9Bh) [0] [1] [2] [99]
.code
array before 9B 9B 9B ... 9B
mov ecx, ArraySize
array after 4D CD CD ... CD
mov esi, 0
clc ; clear carry flag
L1:
rcr array[esi], 1 ; propagate the carry flag
inc esi ; does not modify carry
loop L1 ; does not modify carry
Integer Arithmetic COE 205 – KFUPM slide 21
Binary Multiplication
You know that SHL performs multiplication efficiently
When the multiplier is a power of 2
11
Your Turn . . .
Multiply EAX by 26, using shifting and addition instructions
Hint: 26 = 2 + 8 + 16
mov ebx, eax ; EBX = number
shl eax, 1 ; EAX = number * 2
shl ebx, 3 ; EBX = number * 8
add eax, ebx ; EAX = number * 10
shl ebx, 1 ; EBX = number * 16
add eax, ebx ; EAX = number * 26
12
Convert Number to Hex String
Task: Convert EAX to a Hexadecimal String pointed by ESI
Receives: EAX = Number, ESI= Address of hex string
Returns: String pointed by ESI is filled with hex characters '0' to 'F'
ConvToHexStr PROC USES ebx ecx esi
mov ecx, 8 ; 8 iterations, why?
L1: rol eax, 4 ; rotate upper 4 bits
mov ebx, eax
and ebx, 0Fh ; keep only lower 4 bits
mov bl, HexChar[ebx] ; convert to a hex char
mov [esi], bl ; store hex char in string
inc esi
loop L1 ; loop 8 times
mov BYTE PTR [esi], 0 ; append a null byte
ret
HexChar BYTE "0123456789ABCDEF"
ConvToHexStr ENDP
Integer Arithmetic COE 205 – KFUPM slide 25
DH DL In this example:
0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0
Day = 10
Month = 3
Field: Year Month Day Year = 1980 + 19
Bit numbers: 9-15 5-8 0-4 Date = March 10, 1999
13
Next . . .
Shift and Rotate Instructions
Shift and Rotate Applications
Multiplication and Division Instructions
Translating Arithmetic Expressions
Decimal String to Number Conversions
MUL Instruction
The MUL instruction is used for unsigned multiplication
Multiplies 8-, 16-, or 32-bit operand by AL, AX, or EAX
The instruction formats are:
MUL r/m8 ; AX = AL * r/m8
MUL r/m16 ; DX:AX = AX * r/m16
MUL r/m32 ; EDX:EAX = EAX * r/m32
14
MUL Examples
Example 1: Multiply 16-bit var1 (2000h) * var2 (100h)
.data
var1 WORD 2000h The Carry and Overflow flags are set if
var2 WORD 100h upper half of the product is non-zero
.code
mov ax,var1
mul var2 ; DX:AX = 00200000h, CF = OF = 1
mov eax,12345h
mov ebx,1000h
mul ebx ; EDX:EAX = 0000000012345000h, CF=OF=0
Your Turn . . .
What will be the hexadecimal values of DX, AX, and the
Carry flag after the following instructions execute?
mov ax, 1234h
mov bx, 100h Solution
15
IMUL Instruction
The IMUL instruction is used for signed multiplication
Preserves the sign of the product by sign-extending it
One-Operand formats, as in MUL
IMUL r/m8 ; AX = AL * r/m8
IMUL r/m16 ; DX:AX = AX * r/m16
IMUL r/m32 ; EDX:EAX = EAX * r/m32
Two-Operand formats:
IMUL r16, r16/m16/imm8/imm16 The Carry and Overflow
IMUL r32, r32/m32/imm8/imm32 flags are set if the upper
half of the product is not
Three-Operand formats: a sign extension of the
IMUL r16, r16/m16, imm8/imm16 lower half
IMUL r32, r32/m32, imm8/imm32
IMUL Examples
Multiply AL = 48 by BL = 4
mov al,48
mov bl,4
imul bl ; AX = 00C0h, CF = OF = 1
mov ax,8760h
mov bx,100h
imul bx
DX = FF87h, AX = 6000h, OF = CF = 1
Integer Arithmetic COE 205 – KFUPM slide 32
16
Two and Three Operand Formats
.data
wval SWORD -4
dval SDWORD 4
.code
mov ax, -16
mov bx, 2
imul bx, ax ; BX = BX * AX = -32
imul bx, 2 ; BX = BX * 2 = -64
imul bx, wval ; BX = BX * wval = 256
imul bx, 5000 ; OF = CF = 1
mov edx,-16
imul edx,dval ; EDX = EDX * dval = -64
imul bx, wval,-16 ; BX = wval * -16 = 64
imul ebx,dval,-16 ; EBX = dval * -16 = -64
imul eax,ebx,2000000000 ; OF = CF = 1
Integer Arithmetic COE 205 – KFUPM slide 33
DIV Instruction
The DIV instruction is used for unsigned division
A single operand (divisor) is supplied
Divisor is an 8-bit, 16-bit, or 32-bit register or memory
Dividend is implicit and is either AX, DX:AX, or EDX:EAX
17
DIV Examples
Divide AX = 8003h by CX = 100h
mov dx,0 ; clear dividend, high
mov ax,8003h ; dividend, low
mov cx,100h ; divisor
div cx ; AX = 0080h, DX = 3 (Remainder)
mov dx,0087h
mov ax,6023h
mov bx,100h
div bx Solution: DX = 0023h, AX = 8760h
Divide Overflow
Divide Overflow occurs when …
Quotient cannot fit into the destination operand, or when
Dividing by Zero
Divide Overflow causes a CPU interrupt
The current program halts and an error dialog box is produced
Example of a Divide Overflow
mov dx,0087h
Divide overflow:
mov ax,6002h
Quotient = 87600h
mov bx,10h
Cannot fit in AX
div bx
18
Signed Integer Division
Signed integers must be sign-extended before division
Fill high byte, word, or double-word with a copy of the sign bit
Example:
mov ax, 0FE9Bh ; AX = -357
cwd ; DX:AX = FFFFFF9Bh
IDIV Instruction
IDIV performs signed integer division
Same syntax and operands as DIV instruction
IDIV r/m8
IDIV r/m16
IDIV r/m32
19
IDIV Examples
Example: Divide DX:AX (-48) by BX (-5)
mov ax,-48
cwd ; sign-extend AX into DX
mov bx,-5
idiv bx ; AX = 9, DX = -3
mov eax,48
cdq ; sign-extend EAX into EDX
mov ebx,-5
idiv ebx ; EAX = -9, EDX = 3
Next . . .
Shift and Rotate Instructions
Shift and Rotate Applications
Multiplication and Division Instructions
Translating Arithmetic Expressions
Decimal String to Number Conversions
20
Translating Arithmetic Expressions
Some good reasons to translate arithmetic expressions
Learn how compilers do it
Test your understanding of MUL, IMUL, DIV, and IDIV
Check for Carry and Overflow flags
21
Signed Arithmetic Expressions
Example: var4 = (-var1 * var2) + var3
mov eax, var1
neg eax
imul var2 ; signed multiplication
jo tooBig ; check for overflow
add eax, var3
jo tooBig ; check for overflow
mov var4, eax ; save result
Your Turn . . .
Translate: var5 = (var1 * -var2)/(var3 – var4)
Assume signed 32-bit integers
22
Next . . .
Shift and Rotate Instructions
Shift and Rotate Applications
Multiplication and Division Instructions
Translating Arithmetic Expressions
Decimal String to Number Conversions
23
Convert Decimal String – cont'd
; Assumes: String should contain only decimal chars
; String should not be empty
; Procedure does not detect invalid input
; Procedure does not skip leading spaces
24
Convert to Decimal String – cont'd
ConvToDecStr PROC
pushad ; save all since most are used
mov ecx, 0 ; Used to count decimal digits
mov ebx, 10 ; divisor = 10
L1: mov edx, 0 ; dividend = EDX:EAX
div ebx ; EDX = remainder = 0 to 9
add dl, '0' ; convert DL to '0' to '9'
push dx ; save decimal character
inc ecx ; and count it
cmp eax, 0
jnz L1 ; loop back if EAX != 0
L2: pop dx ; pop in reverse order
mov [esi], dl ; store decimal char in string
inc esi
loop L2
mov BYTE PTR [esi], 0 ; Terminate with a NULL char
popad ; restore all registers
ret ; return
ConvToDecStr ENDP
Integer Arithmetic COE 205 – KFUPM slide 49
Summary
Shift and rotate instructions
Provide finer control over bits than high-level languages
Can shift and rotate more than one bit left or right
SHL, SHR, SAR, SHLD, SHRD, ROL, ROR, RCL, RCR
Shifting left by n bits is a multiplication by 2n
Shifting right does integer division (use SAR to preserve sign)
25