Arithmetic Flags and Instructions
Chapter 6
S. Dandamudi
Outline
Status flags
Application examples
PutInt8
GetInt8
Zero flag
Carry flag
Overflow flag
Sign flag
Auxiliary flag
Parity flag
Multiword arithmetic
Arithmetic instructions
1998
Addition instructions
Subtraction instructions
Multiplication instructions
Division instructions
Addition
Subtraction
Multiplication
Division
Performance: Multiword
multiplication
S. Dandamudi
Arithmetic: Page 2
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags
Six status flags monitor the outcome of arithmetic, logical,
and related operations
Flags Register
FLAGS
EFLAGS
3
1
2
2
I V V A V R
N
0 D I I C M F 0 T
P F
0 0
0 0
2 2
1 0
1
9
1 1
8 7
1
6
1
5
1
4
1
3
1
2
IO
PL
1 1
1 0
O D I T
F F F F
S
F
Z
F
A
P
F 0 F
C
F
Status Flags
Control Flags
System Flags
CF = Carry Flag
PF = Parity Flag
AF = Auxiliary Carry Flag
ZF = Zero Flag
SF = Sign Flag
OF = Overflow Flag
DF = Direction Flag
TF = Trap Flag
IF = Interrupt Flag
IOPL = I/O Privilege Level
NT = Nested Task
RF = Resume Flag
VM = Virtual 8086 Mode
AC = Alignment Check
VIF = Virtual Interrupt Flag
VIP = Virtual Interrupt Pending
ID = ID Flag
31
Instruction Pointer
16 15
EIP
1998
0
IP
S. Dandamudi
Arithmetic: Page 3
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Status flags are updated to indicate certain
properties of the result
Example: If the result is zero, zero flag is set
Once a flag is set, it remains in that state until
another instruction that affects the flags is
executed
Not all instructions affect all status flags
add and sub affect all six flags
inc and dec affect all but the carry flag
mov, push, and pop do not affect any flags
1998
S. Dandamudi
Arithmetic: Page 4
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Example
; initially, assume ZF = 0
mov
AL,55H ; ZF is still zero
sub
AL,55H ; result is 0
; ZF is set (ZF = 1)
push
BX
; ZF remains 1
mov
BX,AX
; ZF remains 1
pop
DX
; ZF remains 1
mov
CX,0
; ZF remains 1
inc
CX
; result is 1
; ZF is cleared (ZF = 0)
1998
S. Dandamudi
Arithmetic: Page 5
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Zero Flag
Indicates zero result
If the result is zero, ZF = 1
Otherwise, ZF = 0
Zero can result in several ways (e.g. overflow)
mov
add
AL,0FH
AL,0F1H
mov
inc
AX,0FFFFH
AX
mov
dec
AX,1
AX
All three examples result in zero result and set ZF
Related instructions
jz jump if zero (jump if ZF = 1)
jnz jump if not zero (jump if ZF = 0)
1998
S. Dandamudi
Arithmetic: Page 6
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Uses of zero flag
Two main uses of zero flag
Testing equality
Often used with cmp instruction
cmp
char,$ ; ZF = 1 if char is $
cmp
AX,BX
Counting to a preset value
Initialize a register with the count value
Decrement it using dec instruction
Use jz/jnz to transfer control
1998
S. Dandamudi
Arithmetic: Page 7
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Consider the following
code
Assembly code
sum := 0
for (I = 1 to M)
for (j = 1 to N)
sum := sum + 1
end for
end for
1998
sub
AX,AX ; AX := 0
mov
DX,M
outer_loop:
mov
CX,N
inner_loop:
inc
AX
loop inner_loop
dec
DX
jnz
outer_loop
exit_loops:
mov
sum,AX
S. Dandamudi
Arithmetic: Page 8
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Two observations
loop instruction is equivalent to
dec
CX
jnz
inner_loop
This two instruction sequence is more efficient than the loop
instruction (takes less time to execute)
loop instruction does not affect any flags!
This two instruction sequence is better than initializing
CX to zero and executing
inc
cmp
jle
1998
CX
CX,N
inner_loop
S. Dandamudi
Arithmetic: Page 9
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Carry Flag
Records the fact that the result of an arithmetic
operation on unsigned numbers is out of range
The carry flag is set in the following examples
mov
add
AL,0FH
AL,0F1H
mov
sub
AX,12AEH
AX,12AFH
Range of 8-, 16-, and 32-bit unsigned numbers
size
1998
range
8 bits
0 to 255 (28 1)
16 bits
32 bits
0 to 65,535 (216 1)
0 to 4,294,967,295 (2321)
S. Dandamudi
Arithmetic: Page 10
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Carry flag is not set by inc and dec instructions
The carry flag is not set in the following examples
mov
AL,0FFH
mov
AX,0
inc
AL
dec
AX
Related instructions
jc
jnc
jump if carry (jump if CF = 1)
jump if no carry (jump if CF = 0)
Carry flag can be manipulated directly using
stc
clc
cmc
1998
set carry flag (set CF to 1)
clear carry flag (clears CF to 0)
complement carry flag (inverts CF value)
S. Dandamudi
Arithmetic: Page 11
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Uses of carry flag
To propagate carry/borrow in multiword
addition/subtraction
1
x = 3710 26A8
y = 489B A321
7FAB C9CA
carry from lower 32 bits
1257 9AE7H
FE60 4213H
10B7 DCFAH
To detect overflow/underflow condition
In the last example, carry out of leftmost bit indicates overflow
To test a bit using the shift/rotate instructions
Bit shifted/rotated out is captured in the carry flag
We can use jc/jnc to test whether this bit is 1 or 0
1998
S. Dandamudi
Arithmetic: Page 12
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Overflow flag
Indicates out-of-range result on signed numbers
Signed number counterpart of the carry flag
The following code sets the overflow flag but not the
carry flag
mov
add
AL,72H
AL,0EH
; 72H = 114D
; 0EH = 14D
Range of 8-, 16-, and 32-bit signed numbers
size
range
128 to +127
16 bits 32,768 to +32,767
32 bits 2,147,483,648 to +2,147,483,647
8 bits
1998
S. Dandamudi
27 to (27 1)
215 to (215 1)
231 to (231 1)
Arithmetic: Page 13
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Signed or unsigned: How does the system know?
The processor does not know the interpretation
It sets carry and overflow under each interpretation
Unsigned interpretation
Signed interpretation
mov
AL,72H
add
AL,0EH
jc
overflow
no_overflow:
mov
AL,72H
add
AL,0EH
jo
overflow
no_overflow:
(no overflow code here)
....
overflow:
(no overflow code here)
....
overflow:
(overflow code here)
....
(overflow code here)
....
1998
S. Dandamudi
Arithmetic: Page 14
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Related instructions
jo
jno
jump if overflow (jump if OF = 1)
jump if no overflow (jump if OF = 0)
There is a special software interrupt instruction
into
interrupt on overflow
Details on this instruction in Chapter 12
Uses of overflow flag
Main use
To detect out-of-range result on signed numbers
1998
S. Dandamudi
Arithmetic: Page 15
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Sign flag
Indicates the sign of the result
Useful only when dealing with signed numbers
Simply a copy of the most significant bit of the result
Examples
mov
add
AL,15
AL,97
mov
sub
clears the sign flag as
the result is 112
(or 0111000 in binary)
AL,15
AL,97
sets the sign flag as
the result is 82
(or 10101110 in binary)
Related instructions
js
jns
1998
jump if sign (jump if SF = 1)
jump if no sign (jump if SF = 0)
S. Dandamudi
Arithmetic: Page 16
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Usage of sign flag
To test the sign of the result
Also useful to efficiently implement countdown loops
Consider the count down loop:
for (i = M downto 0)
<loop body>
end for
The count down loop can be
implemented as
If we dont use the jns, we
need cmp as shown below:
cmp
CX,0
jl
for_loop
1998
S. Dandamudi
mov
CX,M
for_loop:
<loop body>
dec
CX
jns
for_loop
Arithmetic: Page 17
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Auxiliary flag
Indicates whether an operation produced a carry or
borrow in the low-order 4 bits (nibble) of 8-, 16-, or 32bit operands (i.e. operand size doesnt matter)
Example
mov
add
AL,43
AL,94
1
43D = 0010
94D = 0101
137D = 1000
carry from lower 4 bits
1011B
1110B
1001B
As there is a carry from the lower nibble, auxiliary flag is set
1998
S. Dandamudi
Arithmetic: Page 18
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Related instructions
No conditional jump instructions with this flag
Arithmetic operations on BCD numbers use this flag
aaa
ASCII adjust for addition
aas
ASCII adjust for subtraction
aam
ASCII adjust for multiplication
aad
ASCII adjust for division
daa
Decimal adjust for addition
das
Decimal adjust for subtraction
Chapter 11 has more details on these instructions
Usage
Main use is in performing arithmetic operations on BCD
numbers
1998
S. Dandamudi
Arithmetic: Page 19
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Parity flag
Indicates even parity of the low 8 bits of the result
PF is set if the lower 8 bits contain even number 1 bits
For 16- and 32-bit values, only the least significant 8 bits
are considered for computing parity value
Example
mov
add
AL,53
AL,89
53D = 0011 0101B
89D = 0101 1001B
142D = 1000 1110B
As the result has even number of 1 bits, parity flag is set
Related instructions
jp
jnp
1998
jump on even parity (jump if PF = 1)
jump on odd parity (jump if PF = 0)
S. Dandamudi
Arithmetic: Page 20
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Status Flags (contd)
Usage of parity flag
Useful in writing data encoding programs
Example: Encodes the byte in AL (MSB is the parity bit)
parity_encode PROC
shl AL
jp
parity_zero
stc
jmp move_parity_bit
parity_zero:
clc
move_parity_bit:
rcr AL
parity_encode ENDP
1998
S. Dandamudi
Arithmetic: Page 21
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions
Pentium provides several arithmetic instructions
that operate on 8-, 16- and 32-bit operands
Addition: add, adc, inc
Subtraction: sub, sbb, dec, neg, cmp
Multiplication: mul, imul
Division: div, idiv
Related instructions: cbw, cwd, cdq, cwde, movsx, movzx
There are few other instructions such as aaa, aas, etc.
that operate on decimal numbers
See Chapter 11 for details
1998
S. Dandamudi
Arithmetic: Page 22
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Addition instructions
Basic format
add
destination,source
Performs simple integer addition
destination := destination + source
Five operand combinations are possible
add
add
add
add
add
1998
register, register
register,immediate
memory,immediate
register,memory
memory,register
S. Dandamudi
Arithmetic: Page 23
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Basic format
adc
destination,source
Performs integer addition with carry
destination := destination + source + CF
Useful in performing addition of long word arithmetic
The three carry flag manipulating instructions are
useful
stc
clc
cmc
1998
set carry flag (set CF to 1)
clear carry flag (clears CF to 0)
complement carry flag (inverts CF value)
S. Dandamudi
Arithmetic: Page 24
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
The final instruction inc requires a single operand
inc
destination
Performs increment operation
destination := destination + 1
The operand is treated as an unsigned number
Does not affect the carry flag
Other five status flags are updated
In general
inc
BX
is better than
add BX,1
Both take same time but inc version takes less space
1998
S. Dandamudi
Arithmetic: Page 25
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Subtraction instructions
sub
destination,source
Performs simple integer subtraction
destination := destination source
sbb
destination,source
Performs integer subtraction with borrow
destination := destination - source - CF
dec
destination
Performs decrement operation
destination := destination 1
1998
S. Dandamudi
Arithmetic: Page 26
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Subtraction instructions (contd)
neg
destination
Performs sign reversal
destination := 0 destination
Useful in signed number manipulation
cmp
destination,source
Performs subtraction without updating destination
destination - source
Updates all six status flags to record the attributes of the result
The cmp instruction is typically followed by a conditional
jump instruction
1998
S. Dandamudi
Arithmetic: Page 27
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Multiplication
More complicated than add/sub
Produces double-length results
E.g. Multiplying two 8 bit numbers produces a result that
requires 16 bits
Cannot use a single multiply instruction for signed and
unsigned numbers
add and sub instructions work both on signed and
unsigned numbers
For multiplication, we need separate instructions
mul
for unsigned numbers
imul for signed numbers
1998
S. Dandamudi
Arithmetic: Page 28
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Unsigned multiplication
mul
source
Depending on the source operand size, the location of the
other source operand and destination are selected
High-order 8 bits
AL
AX
EAX
1998
8-bit
source
16-bit
source
32-bit
source
AH
Low-order 8 bits
AL
High-order 16 bits
Low-order 16 bits
DX
AX
High-order 32 bits
Low-order 32 bits
EDX
EAX
S. Dandamudi
Arithmetic: Page 29
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Example
mov
mov
mul
AL,10
DL,25
DL
produces 250D in AX register (result fits in AL)
The imul instruction can use the same syntax
Also supports other formats
Example
mov
mov
mul
DL,0FFH
AL,0BEH
DL
; DL := -1
; AL := -66
produces 66D in AX register (again, result fits in AL)
1998
S. Dandamudi
Arithmetic: Page 30
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Division instruction
Even more complicated than multiplication
Produces two results
Quotient
Remainder
In multiplication, using a double-length register, there will not
be any overflow
In division, divide overflow is possible
Pentium provides a special software interrupt when a
divide overflow occurs
Two instructions as in multiplication
div
idiv
1998
source
source
S. Dandamudi
for unsigned numbers
for signed numbers
Arithmetic: Page 31
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
16-bit dividend
Quotient
AX
Remainder
and
AL
AH
8-bit
source
Divisor
32-bit dividend
DX
AX
Quotient
AX
Remainder
and
DX
16-bit
source
Divisor
64-bit dividend
EDX
EAX
Quotient
EAX
Remainder
and
EDX
32-bit
source
Divisor
1998
S. Dandamudi
Arithmetic: Page 32
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Example
mov
mov
div
AX,00FBH
CL,0CH
CL
; AX := 251D
; CL := 12D
produces 20D in AL and 11D as remainder in AH
Example
sub
mov
mov
div
DX,DX
AX,141BH
CX,012CH
CX
; clear DX
; AX := 5147D
; CX := 300D
produces 17D in AX and 47D as remainder in DX
1998
S. Dandamudi
Arithmetic: Page 33
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Signed division requires some help
We extended an unsigned 16 bit number to 32 bits by placing
zeros in the upper 16 bits
This will not work for signed numbers
To extend signed numbers, you have to copy the sign bit
into those upper bit positions
Pentium provides three instructions in aiding sign
extension
All three take no operands
cbw converts byte to word (extends AL into AH)
cwd converts word to doubleword (extends AX into DX)
cdq converts doubleword to quadword
(extends EAX into EDX)
1998
S. Dandamudi
Arithmetic: Page 34
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Some additional related instructions
Sign extension
cwde converts word to doubleword
(extends AX into EAX)
Two move instructions
movsx dest,src (move sign-extended src to dest)
movzx dest,src (move zero-extended src to dest)
For both move instructions, dest has to be a register
The src operand can be in a register or memory
If src is 8-bits, dest has to be either a 16 bit or 32 bit
register
If src is 16-bits, dest has to be a 32 bit register
1998
S. Dandamudi
Arithmetic: Page 35
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Arithmetic Instructions (contd)
Example
mov
cbw
mov
idiv
AL,0A1H
CL,0CH
CL
; AL := -95D
; AH = FFH
; CL := 12D
produces 7D in AL and 11D as remainder in AH
Example
mov
cwd
mov
idiv
AX,0EBE5
CX,012CH
CX
; AX := -5147D
; DX := FFFFH
; CX := 300D
produces 17D in AX and 47D as remainder in DX
1998
S. Dandamudi
Arithmetic: Page 36
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Application Examples
PutInt8 procedure
To display a number, repeatedly divide it by 10 and
display the remainders obtained
108/10
10/10
1/10
quotient
10
1
0
remainder
8
0
1
To display digits, they must be converted to their
character form
This means simply adding the ASCII code for zero (see line
24)
line 24:
add
AH,0
1998
S. Dandamudi
Arithmetic: Page 37
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Application Examples (contd)
GetInt8 procedure
To read a number, read each digit character
Convert to its numeric equivalent
Multiply the running total by 10 and add this digit
Input digit
Initial value
1
5
8
1998
Numeric
value (N)
-1
5
8
Number := Number*10 + N
0
0 * 10 + 1 = 1
1 * 10 + 5 = 15
15 * 10 + 8 = 158
S. Dandamudi
Arithmetic: Page 38
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Multiword Arithmetic
Arithmetic operations (add, sub, mul, and div)
work on 8-, 16-, or 32-bit operands
Arithmetic on larger operands require multiword
arithmetic software routines
Addition/subtraction
These two operations are straightforward to extend to
larger operand sizes
Need to use adc/sbb versions to include the carry
generated by the previous group of bits
Example addition on the next slide
1998
S. Dandamudi
Arithmetic: Page 39
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Multiword Arithmetic (contd)
;-----------------------------------------------;Adds two 64-bit numbers in EBX:EAX and EDX:ECX.
;The result is returned in EBX:EAX.
;Overflow/underflow conditions are indicated
;by setting the carry flag.
;Other registers are not disturbed.
;------------------------------------------------
add64
PROC
add
EAX,ECX
adc
EBX,EDX
ret
add64
ENDP
1998
S. Dandamudi
Arithmetic: Page 40
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Multiword Arithmetic (contd)
Multiplication
We consider two algorithms
Longhand multiplication
Uses the method that we are familiar with
Needs addition operations only
Examines each bit in the multiplier and adds the
multiplicand if the multiplier bit is 1
Appropriate shifting is required
Using the mul instruction
Chops the operand into 32-bit chunks and applies mul
instruction
Similar to the addition example seen before
1998
S. Dandamudi
Arithmetic: Page 41
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Multiword Arithmetic (contd)
Longhand multiplication
Final 128-bit result in P:A
P := 0; count := 64
A := multiplier; B := multiplicand
while (count > 0)
if (LSB of A = 1)
then P := P+B
CF := carry generated by P+B
else CF := 0
end if
shift right CF:P:A by one bit position
count := count-1
end while
1998
S. Dandamudi
Arithmetic: Page 42
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Multiword Arithmetic (contd)
Using the mul instruction
A 64-bit number is treated as two 32-bit numbers
A is considered as consisting of A1A0 (similarly B)
Left shift operation replaces zeros on the right
temp := A0 B0
result := temp
temp := A1 B0
temp := left shift temp
by 32 bits
result := result + temp
1998
S. Dandamudi
temp := A0 B1
temp := left shift temp
by 32 bits
result := result + temp
temp := A1 B1
temp := left shift temp
by 32 bits
result := result + temp
Arithmetic: Page 43
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Multiword Arithmetic (contd)
Division
To implement n-bit division (A by B), we need an
additional n+1 bit register P
Core part of the algorithm
Test the sign of P
if P is negative
left shift P:A by one bit position
P := P+B
else
left shift P:A by one bit position
P := PB
1998
S. Dandamudi
Arithmetic: Page 44
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Multiword Arithmetic (contd)
Division Algorithm
A = quotient, P = remainder
P := 0; count := 64
A := dividend
B := divisor
while (count > 0)
if (P is negative)
then shift left P:A
by 1 bit position
P := P+B
else shift left P:A
by 1 bit position
P := P-B
end if
1998
if (P is negative)
then set low-order
bit of A to 0
else set low-order
bit of A to 1
end if
count := count-1
end while
if (P is negative)
P := P+B
end if
S. Dandamudi
Arithmetic: Page 45
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Performance: Multiword Multiplication
Longhand version versus mul version
To multiply 2641 2641
Execution time (seconds)
20
ithm
r
o
alg
15
10
on
mul instructi
0
0
100
200
300
400
500
600
700
Number of calls (in thousands)
1998
S. Dandamudi
Arithmetic: Page 46
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Performance: Multiword Multiply (contd)
Using add versus mul instruction
Certain special cases of multiplication can be done by a
series additions (e.g. power of 2 by shift operations)
Example: Multiplication by 10
Instead of using mul instruction, we can multiply by 10
using add instructions as follows (performs AL 10):
sub
mov
add
add
add
add
1998
AH,AH
BX,AX
AX,AX
AX,AX
AX,BX
AX,AX
;
;
;
;
;
;
AH
BX
AX
AX
AX
AX
S. Dandamudi
:=
:=
:=
:=
:=
:=
0
x
2x
4x
5x
10x
Arithmetic: Page 47
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.
Performance: Multiword Multiply (contd)
Multiplication of 2321 by 10
Execution time (seconds)
2.0
1.6
tion
uc
nstr
li
1.2
mu
0.8
ction
u
r
t
s
n
add i
0.4
0.0
0
100
200
300
400
500
600
700
Number of calls (in thousands)
1998
S. Dandamudi
Arithmetic: Page 48
To be used with S. Dandamudi, Introduction to Assembly Language Programming, Springer-Verlag, 1998.