0% found this document useful (0 votes)
209 views48 pages

Arithmetic Flags and Instructions: S. Dandamudi

The document discusses arithmetic flags and instructions in CPUs. It describes the six main status flags - zero, carry, overflow, sign, auxiliary and parity flags - that are set by arithmetic and logical instructions to indicate properties of results. The functions of each flag are explained through examples. Common instructions related to flags like conditional jumps are also covered. The uses and significance of each flag in applications like detecting overflow, equality testing and multiword arithmetic are summarized.

Uploaded by

Mohamed Nabil
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
209 views48 pages

Arithmetic Flags and Instructions: S. Dandamudi

The document discusses arithmetic flags and instructions in CPUs. It describes the six main status flags - zero, carry, overflow, sign, auxiliary and parity flags - that are set by arithmetic and logical instructions to indicate properties of results. The functions of each flag are explained through examples. Common instructions related to flags like conditional jumps are also covered. The uses and significance of each flag in applications like detecting overflow, equality testing and multiword arithmetic are summarized.

Uploaded by

Mohamed Nabil
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 48

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.

You might also like