you have to read the slide and answer the questions.
- Algorithm Workbench (write the answers) questions – 3, 4, 5, 6, 9 and 11
- Review (Short Answer) Questions – 3 and 4
Assembly Language for x86 Processors
Eighth Edition
Chapter 7
Integer Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-1
Chapter Overview
• Shift and Rotate Instructions
• Shift and Rotate Applications
• Multiplication and Division Instructions
• Extended Addition and Subtraction
• ASCII and Unpacked Decimal Arithmetic
• Packed Decimal Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-2
Shift and Rotate Instructions
• Logical vs Arithmetic Shifts
• SHL Instruction
• SHR Instruction
• SAL and SAR Instructions
• ROL Instruction
• ROR Instruction
• RCL and RCR Instructions
• SHLD/SHRD Instructions
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-3
Logical Shift
• A logical shift fills the newly created bit position
with zero:
0
CF
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-4
Arithmetic Shift
• An arithmetic shift fills the newly created bit
position with a copy of the number’s sign bit:
CF
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-5
SHL Instruction
• The SHL (shift left) instruction performs a logical left shift
on the destination operand, filling the lowest bit with 0.
• Operand types for SHL:
SHL reg,imm8
SHL mem,imm8
SHL reg,CL
SHL mem,CL
(Same for all shift and rotate instructions)
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-6
Fast Multiplication
Shifting left 1 bit multiplies a number by 2
mov dl,5
shl dl,1
Before:
00000101
=5
After:
00001010
= 10
Shifting left n bits multiplies the operand by 2n
For example, 5 * 22 = 20
mov dl,5
shl dl,2
; DL = 20
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-7
SHR Instruction
• The SHR (shift right) instruction performs a logical right
shift on the destination operand. The highest bit position is
filled with a zero.
0
CF
Shifting right n bits divides the operand by 2n
mov dl,80
shr dl, 1
shr dl, 2
; DL = 40
; DL = 10
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-8
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
An arithmetic shift preserves the number’s sign.
mov dl,-80
sar dl,1
sar dl,2
; DL = -40
; DL = -10
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-9
Your turn . . . (1 of 16)
Indicate the hexadecimal value of AL after each
shift:
mov al,6Bh
shr al,1
shl al,3
mov al,8Ch
sar al,1
sar al,3
6Bh = 107
Binary 01101011
a. 35h
b. A8h
c. C6h
d. F8h
35h = 53 A8h = 168 C6h = 198
00110101 10101000 11000110
F8h = 248
11111000
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 10
ROL Instruction
• ROL (rotate) shifts each bit to the left
• The highest bit is copied into both the Carry flag and into
the lowest bit
• No bits are lost
CF
mov al,11110000b
rol al,1
; AL = 11100001b
mov dl,3Fh
rol dl,4
; DL = F3h
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 11
ROR Instruction
• ROR (rotate right) shifts each bit to the right
• The lowest bit is copied into both the Carry flag and into
the highest bit
• No bits are lost
CF
mov al,11110000b
ror al,1
; AL = 01111000b
mov dl,3Fh
ror dl,4
; DL = F3h
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 12
Your turn . . . (2 of 16)
Indicate the hexadecimal value of AL after each
rotation:
mov al,6Bh
ror al,1
rol al,3
6Bh = 107
Binary 01101011
a. B5h
b. ADh
B5h = 181
10110101
ADh = 173
10101101
CF
CF
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 13
RCL Instruction
• RCL (rotate carry left) shifts each bit to the left
• Copies the Carry flag to the least significant bit
• Copies the most significant bit to the Carry flag
CF
clc
mov bl,88h
rcl bl,1
rcl bl,1
; CF = 0
; CF,BL = 0 10001000b
; CF,BL = 1 00010000b
; CF,BL = 0 00100001b
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 14
RCR Instruction
• RCR (rotate carry right) shifts each bit to the right
• Copies the Carry flag to the most significant bit
• Copies the least significant bit to the Carry flag
CF
stc
mov ah,10h
rcr ah,1
; CF = 1
; CF,AH = 1 00010000b
; CF,AH = 0 10001000b
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 15
Your turn . . . (3 of 16)
Indicate the hexadecimal value of AL after each rotation:
stc
mov al,6Bh
rcr al,1
rcl al,3
6Bh = 107
Binary 01101011
a. B5h
b. AEh
B5h = 181
10110101
AEh = 174
10101110
CF
CF
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 16
SHLD Instruction
• Shifts a destination operand a given number of bits to the
left
• The bit positions opened up by the shift are filled by the
most significant bits of the source operand
• The source operand is not affected
• Syntax:
– SHLD destination, source, count
• Operand types:
SHLD reg16/32, reg16/32, imm8/CL
SHLD mem16/32, reg16/32, imm8/CL
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 17
SHLD Example
Shift count of 1:
mov al,11100000b
mov bl,10011101b
shld al,bl,1
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 18
Another SHLD Example
Shift wval 4 bits to the left and replace its
lowest 4 bits with the high 4 bits of AX:
.data
wval WORD 9BA6h
.code
mov ax,0AC36h
shld wval,ax,4
wval
AX
9BA6
AC36
BA6A
AC36
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 19
SHRD Instruction
• Shifts a destination operand a given number of bits to the
right
• The bit positions opened up by the shift are filled by the
least significant bits of the source operand
• The source operand is not affected
• Syntax:
– SHRD destination, source, count
• Operand types:
SHRD reg16/32, reg16/32, imm8/CL
SHRD mem16/32, reg16/32, imm8/CL
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 20
SHRD Example
Shift count of 1:
mov al,11000001b
mov bl,00011101b
shrd al,bl,1
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 21
Another SHRD Example
Shift AX 4 bits to the right and replace its highest 4 bits with
the low 4 bits of DX:
mov ax,234Bh
mov dx,7654h
shrd ax,dx,4
DX
AX
7654
234B
7654
4234
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 22
Your turn . . . (4 of 16)
Indicate the hexadecimal values of each destination
operand: SHL(R)D destination, source, count:
mov ax,7C36h
mov dx,9FA6h
shld dx,ax,4
shrd dx,ax,8
Binary
; DX = FA67h
; DX = 36FAh
7C36h = 31798 9FA6h = 40870 FA67h = 64103
0111110000110110
1001111110100110
1111101001100111
Shift dx left 4 bits and replace the lower 4 bits with the 4 high bits in ax
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 23
Irvine, Kip R. Assembly Language
for x86 Processors 7/e, 2015.
Your turn . . .
Indicate the hexadecimal values of each destination operand
– SHL(R)D destination, source, count :
mov ax,7C36h
mov dx,9FA6h
shld dx,ax,4
shrd dx,ax,8
Binary
; DX = FA67h
; DX = 36FAh
7C36h = 31798 9FA6h = 40870 FA67h = 64103 36FAh = 14074
0111110000110110
1001111110100110
1111101001100111
001011011111010
Shift dx right 8 bits and replace the highest 8 bits with the 8 low bits in ax
24
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 24
What’s Next (1 of 5)
• Shift and Rotate Instructions
• Shift and Rotate Applications
• Multiplication and Division Instructions
• Extended Addition and Subtraction
• ASCII and Unpacked Decimal Arithmetic
• Packed Decimal Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 25
Shift and Rotate Applications
• Shifting Multiple Doublewords
• Binary Multiplication
• Displaying Binary Bits
• Isolating a Bit String
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 26
Shifting Multiple Doublewords
• Programs sometimes need to shift all bits within an array,
as one might when moving a bitmapped graphic image
from one screen location to another.
• The following shifts an array of 3 doublewords 1 bit to the
right (view complete source code):
.data
ArraySize = 3
array DWORD ArraySize DUP(99999999h)
; 1001 1001…
.code
mov esi,0
shr array[esi + 8],1
; high dword
rcr array[esi + 4],1
; middle dword, include Carry
rcr array[esi],1
; low dword, include Carry
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 27
Binary Multiplication (1 of 2)
• mutiply 123 * 36
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 28
Binary Multiplication (2 of 2)
• We already know that SHL performs unsigned
multiplication efficiently when the multiplier is a power of 2.
• You can factor any binary number into powers of 2.
– For example, to multiply EAX * 36, factor 36 into 32 + 4 and use
the distributive property of multiplication to carry out the operation:
EAX * 36
= EAX * (32 + 4)
= (EAX * 32)+(EAX * 4)
mov eax,123
mov ebx,eax
shl eax,5
shl ebx,2
add eax,ebx
; mult by 25
; mult by 22
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 29
Your turn . . . (5 of 16)
Multiply AX by 26, using shifting and addition
instructions. Hint: 26 = 16 + 8 + 2.
mov ax,2
; test value
mov dx,ax
shl dx,4
push edx
mov dx,ax
shl dx,3
shl ax,1
add ax,dx
pop edx
add ax,dx
; AX * 16
; save for later
; AX * 8
; AX * 2
; AX * 10
; recall AX * 16
; AX * 26
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 30
Isolating a Bit String
• The MS-DOS file date field packs the year, month, and day
into 16 bits:
DH
DL
0 0 1 0 0 1 1 0
0 1 1 0 1 0 1 0
Field:
Bit numbers:
Year
9-15
Month
5-8
Day
0-4
Isolate the Month field:
mov ax,dx
shr ax,5
and al,00001111b
mov month,al
; make a copy of DX
; shift right 5 bits
; clear bits 4-7
; save in month variable
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 32
What’s Next (2 of 5)
• Shift and Rotate Instructions
• Shift and Rotate Applications
• Multiplication and Division Instructions
• Extended Addition and Subtraction
• ASCII and Unpacked Decimal Arithmetic
• Packed Decimal Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 33
Multiplication and Division Instructions
• MUL Instruction
• IMUL Instruction
• DIV Instruction
• Signed Integer Division
• CBW, CWD, CDQ Instructions
• IDIV Instruction
• Implementing Arithmetic Expressions
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 34
MUL Instruction
• In 32-bit mode, MUL (unsigned multiply) instruction
multiplies an 8-, 16-, or 32-bit operand by either AL, AX, or
EAX.
• The instruction formats are:
MUL r/m8
MUL r/m16
MUL r/m32
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 35
64-Bit MUL Instruction
• In 64-bit mode, MUL (unsigned multiply) instruction
multiplies a 64-bit operand by RAX, producing a 128-bit
product.
• The instruction formats are:
MUL r/m64
• Example:
mov rax,0FFFF0000FFFF0000h
mov rbx,2
mul rbx
; RDX:RAX = 0000000000000001FFFE0001FFFE0000
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 36
MUL Examples
100h * 2000h, using 16-bit operands:
.data
val1 WORD 2000h
val2 WORD 100h
.code
mov ax,val1
mul val2
; DX:AX = 00200000h, CF=1
The Carry flag indicates
whether or not the upper
half of the product
contains significant digits.
12345h * 1000h, using 32-bit operands:
mov eax,12345h
mov ebx,1000h
mul ebx
; EDX:EAX = 0000000012345000h, CF=0
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 37
Your turn . . . (6 of 16)
What will be the hexadecimal values of DX, AX, and the
Carry flag after the following instructions execute?
mov ax,1234h
mov bx,100h
mul bx
DX = 0012h, AX = 3400h, CF = 1 (upper half
contains significant digit)
123400h = 1192960d
4660d * 256d = 1192960d
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 38
Your turn . . . (7 of 16)
What will be the hexadecimal values of EDX, EAX, and the
Carry flag after the following instructions execute?
mov eax,00128765h
mov ecx,10000h
mul ecx
EDX = 00000012h, EAX = 87650000h, CF = 1
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 39
IMUL Instruction
• IMUL (signed integer multiply) multiplies an 8-, 16-, or 32bit signed operand by either AL, AX, or EAX
• Preserves the sign of the product by sign-extending it into
the upper half of the destination register
Example: multiply 48 * 4, using 8-bit operands:
mov al,48
mov bl,4
imul bl
; AX = 00C0h, OF=1
OF=1 because AH is not a sign extension of AL.
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 40
IMUL Examples
Multiply 4,823,424 * -423:
mov eax,4823424
mov ebx,-423
imul ebx
; EDX:EAX = FFFFFFFF86635D80h, OF=0
OF=0 because EDX is a sign extension of EAX.
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 42
Your turn . . . (8 of 16)
What will be the hexadecimal values of DX, AX, and the Carry
flag after the following instructions execute?
mov ax,8760h
mov bx,100h
imul bx
DX = FF87h, AX = 6000h, OF = 1
876000h = 8871936d
34656d * 256d = 8871936d
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 43
DIV Instruction
• The DIV (unsigned divide) instruction performs 8-bit, 16bit, and 32-bit division on unsigned integers
• A single operand is supplied (register or memory operand),
which is assumed to be the divisor
• Instruction formats:
DIV reg/mem8
Default Operands:
DIV reg/mem16
DIV reg/mem32
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 44
DIV Examples
Divide 8003h by 100h, using 16-bit operands:
mov dx,0
mov ax,8003h
mov cx,100h
div cx
; clear dividend, high
; dividend, low
; divisor
; AX = 0080h, DX = 3
32771 / 256 = 128d = 0080h
DX contains 3
Same division, using 32-bit operands:
mov edx,0
mov eax,8003h
mov ecx,100h
div ecx
; clear dividend, high
; dividend, low
; divisor
; EAX = 00000080h, DX = 3
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 45
Your turn . . . (9 of 16)
What will be the hexadecimal values of DX and AX after the following
instructions execute? Or, if divide overflow occurs, you can indicate that
as your answer:
mov dx,0087h
mov ax,6000h
mov bx,100h
div bx
; 135d
; 24576d
; 256d
10000111 high
0110000000000000
100000000
DX = 0000h, AX = 8760h
DX – 0d, AX = 34656d
10000111 011000000000000 / 100000000 = 1000011101100000
8871936d / 256d = 34656d
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 47
Signed Integer Division (IDIV)
• Signed integers must be sign-extended before division
takes place
– fill high byte/word/doubleword with a copy of the low
byte/word/doubleword’s sign bit
• For example, the high byte contains a copy of the sign bit
from the low byte:
10001111
11111111
10001111
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 49
CBW, CWD, CDQ Instructions
• The CBW, CWD, and CDQ instructions provide important
sign-extension operations:
– CBW (convert byte to word) extends AL into AH
– CWD (convert word to doubleword) extends AX into DX
– CDQ (convert doubleword to quadword) extends EAX into EDX
• Example:
.data
dwordVal SDWORD -101
; FFFFFF9Bh
.code
mov eax,dwordVal
cdq
; EDX:EAX = FFFFFFFFFFFFFF9Bh
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 50
IDIV Instruction
• IDIV (signed divide) performs signed integer
division
• Same syntax and operands as DIV instruction
Example: 8-bit division of –48 by 5
mov al,-48
cbw
mov bl,5
idiv bl
; extend AL into AH
; AL = -9, AH = -3
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 51
IDIV Examples
Example: 16-bit division of –48 by 5
mov ax,-48
cwd
mov bx,5
idiv bx
; extend AX into DX
; AX = -9, DX = -3
Example: 32-bit division of –48 by 5
mov eax,-48
cdq
mov ebx,5
idiv ebx
; extend EAX into EDX
; EAX = -9, EDX = -3
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 52
Your turn . . . (11 of 16)
What will be the hexadecimal values of DX and AX after the
following instructions execute? Or, if divide overflow occurs,
you can indicate that as your answer:
mov ax,0FDFFh
cwd
mov bx,100h
idiv bx
; -513
DX = FFFFh (-1), AX = FFFEh (-2)
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 53
Unsigned Arithmetic Expressions
• Some good reasons to learn how to implement integer
expressions:
– Learn how do compilers do it
– Test your understanding of MUL, IMUL, DIV, IDIV
– Check for overflow (Carry and Overflow flags)
Example: var4 = (var1 + var2) * var3
; Assume unsigned operands
mov eax,var1
add eax,var2
; EAX = var1 + var2
mul var3
; EAX = EAX * var3
jc TooBig
; check for carry
mov var4,eax
; save product
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 54
Signed Arithmetic Expressions (1 of 2)
Example: eax = (-var1 * var2) + var3
mov eax,var1
neg eax
imul var2
jo TooBig
add eax,var3
jo TooBig
; check for overflow
; check for overflow
Example: var4 = (var1 * 5) / (var2 – 3)
mov eax,var1
mov ebx,5
imul ebx
mov ebx,var2
sub ebx,3
idiv ebx
mov var4,eax
; left side
; EDX:EAX = product
; right side
; EAX = quotient
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 55
Your turn . . . (12 of 16)
Implement the following expression using signed
32-bit integers:
eax = (ebx * 20) / ecx
mov eax,20
imul ebx
idiv ecx
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 57
Your turn . . . (13 of 16)
Implement the following expression using signed
32-bit integers: Save and restore ECX and EDX:
eax = (ecx * edx) / eax
push edx
push eax
mov eax,ecx
imul edx
pop ebx
idiv ebx
pop edx
; EAX needed later
; left side: EDX:EAX
; saved value of EAX
; EAX = quotient
; restore EDX, ECX
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 58
Your turn . . . (14 of 16)
Implement the following expression using signed
32-bit integers. Do not modify any variables other
than var3:
var3 = (var1 * -var2) / (var3 – ebx)
mov eax,var1
mov edx,var2
neg edx
imul edx
mov ecx,var3
sub ecx,ebx
idiv ecx
mov var3,eax
; left side: EDX:EAX
; EAX = quotient
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 59
What’s Next (3 of 5)
• Shift and Rotate Instructions
• Shift and Rotate Applications
• Multiplication and Division Instructions
• Extended Addition and Subtraction
• ASCII and UnPacked Decimal Arithmetic
• Packed Decimal Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 60
Summary
• Shift and rotate instructions are some of the best tools of
assembly language
– finer control than in high-level languages
– SHL, SHR, SAR, ROL, ROR, RCL, RCR
• MUL and DIV – integer operations
– close relatives of SHL and SHR
– CBW, CDQ, CWD: preparation for division
• 32-bit Mode only:
– Extended precision arithmetic: ADC, SBB
– ASCII decimal operations (AAA, AAS, AAM, AAD)
– Packed decimal operations (DAA, DAS)
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 86
Extra
55 74 67 61 6E 67 65 6E
Utgangen
End (Norwegian)
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 87
Copyright
This work is protected by United States copyright laws and is
provided solely for the use of instructors in teaching their
courses and assessing student learning. Dissemination or sale of
any part of this work (including on the World Wide Web) will
destroy the integrity of the work and is not permitted. The work
and materials from it should never be made available to students
except by instructors using the accompanying text in their
classes. All recipients of this work are expected to abide by these
restrictions and to honor the intended pedagogical purposes and
the needs of other instructors who rely on these materials.
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 88
Assembly Language for x86 Processors
Eighth Edition
Chapter 7
Integer Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-1
Chapter Overview
• Shift and Rotate Instructions
• Shift and Rotate Applications
• Multiplication and Division Instructions
• Extended Addition and Subtraction
• ASCII and Unpacked Decimal Arithmetic
• Packed Decimal Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-2
Shift and Rotate Instructions
• Logical vs Arithmetic Shifts
• SHL Instruction
• SHR Instruction
• SAL and SAR Instructions
• ROL Instruction
• ROR Instruction
• RCL and RCR Instructions
• SHLD/SHRD Instructions
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-3
Logical Shift
• A logical shift fills the newly created bit position
with zero:
0
CF
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-4
Arithmetic Shift
• An arithmetic shift fills the newly created bit
position with a copy of the number’s sign bit:
CF
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-5
SHL Instruction
• The SHL (shift left) instruction performs a logical left shift
on the destination operand, filling the lowest bit with 0.
• Operand types for SHL:
SHL reg,imm8
SHL mem,imm8
SHL reg,CL
SHL mem,CL
(Same for all shift and rotate instructions)
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-6
Fast Multiplication
Shifting left 1 bit multiplies a number by 2
mov dl,5
shl dl,1
Before:
00000101
=5
After:
00001010
= 10
Shifting left n bits multiplies the operand by 2n
For example, 5 * 22 = 20
mov dl,5
shl dl,2
; DL = 20
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-7
SHR Instruction
• The SHR (shift right) instruction performs a logical right
shift on the destination operand. The highest bit position is
filled with a zero.
0
CF
Shifting right n bits divides the operand by 2n
mov dl,80
shr dl, 1
shr dl, 2
; DL = 40
; DL = 10
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-8
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
An arithmetic shift preserves the number’s sign.
mov dl,-80
sar dl,1
sar dl,2
; DL = -40
; DL = -10
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7-9
Your turn . . . (1 of 16)
Indicate the hexadecimal value of AL after each
shift:
mov al,6Bh
shr al,1
shl al,3
mov al,8Ch
sar al,1
sar al,3
6Bh = 107
Binary 01101011
a. 35h
b. A8h
c. C6h
d. F8h
35h = 53 A8h = 168 C6h = 198
00110101 10101000 11000110
F8h = 248
11111000
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 10
ROL Instruction
• ROL (rotate) shifts each bit to the left
• The highest bit is copied into both the Carry flag and into
the lowest bit
• No bits are lost
CF
mov al,11110000b
rol al,1
; AL = 11100001b
mov dl,3Fh
rol dl,4
; DL = F3h
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 11
ROR Instruction
• ROR (rotate right) shifts each bit to the right
• The lowest bit is copied into both the Carry flag and into
the highest bit
• No bits are lost
CF
mov al,11110000b
ror al,1
; AL = 01111000b
mov dl,3Fh
ror dl,4
; DL = F3h
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 12
Your turn . . . (2 of 16)
Indicate the hexadecimal value of AL after each
rotation:
mov al,6Bh
ror al,1
rol al,3
6Bh = 107
Binary 01101011
a. B5h
b. ADh
B5h = 181
10110101
ADh = 173
10101101
CF
CF
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 13
RCL Instruction
• RCL (rotate carry left) shifts each bit to the left
• Copies the Carry flag to the least significant bit
• Copies the most significant bit to the Carry flag
CF
clc
mov bl,88h
rcl bl,1
rcl bl,1
; CF = 0
; CF,BL = 0 10001000b
; CF,BL = 1 00010000b
; CF,BL = 0 00100001b
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 14
RCR Instruction
• RCR (rotate carry right) shifts each bit to the right
• Copies the Carry flag to the most significant bit
• Copies the least significant bit to the Carry flag
CF
stc
mov ah,10h
rcr ah,1
; CF = 1
; CF,AH = 1 00010000b
; CF,AH = 0 10001000b
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 15
Your turn . . . (3 of 16)
Indicate the hexadecimal value of AL after each rotation:
stc
mov al,6Bh
rcr al,1
rcl al,3
6Bh = 107
Binary 01101011
a. B5h
b. AEh
B5h = 181
10110101
AEh = 174
10101110
CF
CF
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 16
SHLD Instruction
• Shifts a destination operand a given number of bits to the
left
• The bit positions opened up by the shift are filled by the
most significant bits of the source operand
• The source operand is not affected
• Syntax:
– SHLD destination, source, count
• Operand types:
SHLD reg16/32, reg16/32, imm8/CL
SHLD mem16/32, reg16/32, imm8/CL
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 17
SHLD Example
Shift count of 1:
mov al,11100000b
mov bl,10011101b
shld al,bl,1
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 18
Another SHLD Example
Shift wval 4 bits to the left and replace its
lowest 4 bits with the high 4 bits of AX:
.data
wval WORD 9BA6h
.code
mov ax,0AC36h
shld wval,ax,4
wval
AX
9BA6
AC36
BA6A
AC36
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 19
SHRD Instruction
• Shifts a destination operand a given number of bits to the
right
• The bit positions opened up by the shift are filled by the
least significant bits of the source operand
• The source operand is not affected
• Syntax:
– SHRD destination, source, count
• Operand types:
SHRD reg16/32, reg16/32, imm8/CL
SHRD mem16/32, reg16/32, imm8/CL
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 20
SHRD Example
Shift count of 1:
mov al,11000001b
mov bl,00011101b
shrd al,bl,1
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 21
Another SHRD Example
Shift AX 4 bits to the right and replace its highest 4 bits with
the low 4 bits of DX:
mov ax,234Bh
mov dx,7654h
shrd ax,dx,4
DX
AX
7654
234B
7654
4234
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 22
Your turn . . . (4 of 16)
Indicate the hexadecimal values of each destination
operand: SHL(R)D destination, source, count:
mov ax,7C36h
mov dx,9FA6h
shld dx,ax,4
shrd dx,ax,8
Binary
; DX = FA67h
; DX = 36FAh
7C36h = 31798 9FA6h = 40870 FA67h = 64103
0111110000110110
1001111110100110
1111101001100111
Shift dx left 4 bits and replace the lower 4 bits with the 4 high bits in ax
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 23
Irvine, Kip R. Assembly Language
for x86 Processors 7/e, 2015.
Your turn . . .
Indicate the hexadecimal values of each destination operand
– SHL(R)D destination, source, count :
mov ax,7C36h
mov dx,9FA6h
shld dx,ax,4
shrd dx,ax,8
Binary
; DX = FA67h
; DX = 36FAh
7C36h = 31798 9FA6h = 40870 FA67h = 64103 36FAh = 14074
0111110000110110
1001111110100110
1111101001100111
001011011111010
Shift dx right 8 bits and replace the highest 8 bits with the 8 low bits in ax
24
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 24
What’s Next (1 of 5)
• Shift and Rotate Instructions
• Shift and Rotate Applications
• Multiplication and Division Instructions
• Extended Addition and Subtraction
• ASCII and Unpacked Decimal Arithmetic
• Packed Decimal Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 25
Shift and Rotate Applications
• Shifting Multiple Doublewords
• Binary Multiplication
• Displaying Binary Bits
• Isolating a Bit String
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 26
Shifting Multiple Doublewords
• Programs sometimes need to shift all bits within an array,
as one might when moving a bitmapped graphic image
from one screen location to another.
• The following shifts an array of 3 doublewords 1 bit to the
right (view complete source code):
.data
ArraySize = 3
array DWORD ArraySize DUP(99999999h)
; 1001 1001…
.code
mov esi,0
shr array[esi + 8],1
; high dword
rcr array[esi + 4],1
; middle dword, include Carry
rcr array[esi],1
; low dword, include Carry
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 27
Binary Multiplication (1 of 2)
• mutiply 123 * 36
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 28
Binary Multiplication (2 of 2)
• We already know that SHL performs unsigned
multiplication efficiently when the multiplier is a power of 2.
• You can factor any binary number into powers of 2.
– For example, to multiply EAX * 36, factor 36 into 32 + 4 and use
the distributive property of multiplication to carry out the operation:
EAX * 36
= EAX * (32 + 4)
= (EAX * 32)+(EAX * 4)
mov eax,123
mov ebx,eax
shl eax,5
shl ebx,2
add eax,ebx
; mult by 25
; mult by 22
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 29
Your turn . . . (5 of 16)
Multiply AX by 26, using shifting and addition
instructions. Hint: 26 = 16 + 8 + 2.
mov ax,2
; test value
mov dx,ax
shl dx,4
push edx
mov dx,ax
shl dx,3
shl ax,1
add ax,dx
pop edx
add ax,dx
; AX * 16
; save for later
; AX * 8
; AX * 2
; AX * 10
; recall AX * 16
; AX * 26
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 30
Isolating a Bit String
• The MS-DOS file date field packs the year, month, and day
into 16 bits:
DH
DL
0 0 1 0 0 1 1 0
0 1 1 0 1 0 1 0
Field:
Bit numbers:
Year
9-15
Month
5-8
Day
0-4
Isolate the Month field:
mov ax,dx
shr ax,5
and al,00001111b
mov month,al
; make a copy of DX
; shift right 5 bits
; clear bits 4-7
; save in month variable
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 32
What’s Next (2 of 5)
• Shift and Rotate Instructions
• Shift and Rotate Applications
• Multiplication and Division Instructions
• Extended Addition and Subtraction
• ASCII and Unpacked Decimal Arithmetic
• Packed Decimal Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 33
Multiplication and Division Instructions
• MUL Instruction
• IMUL Instruction
• DIV Instruction
• Signed Integer Division
• CBW, CWD, CDQ Instructions
• IDIV Instruction
• Implementing Arithmetic Expressions
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 34
MUL Instruction
• In 32-bit mode, MUL (unsigned multiply) instruction
multiplies an 8-, 16-, or 32-bit operand by either AL, AX, or
EAX.
• The instruction formats are:
MUL r/m8
MUL r/m16
MUL r/m32
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 35
64-Bit MUL Instruction
• In 64-bit mode, MUL (unsigned multiply) instruction
multiplies a 64-bit operand by RAX, producing a 128-bit
product.
• The instruction formats are:
MUL r/m64
• Example:
mov rax,0FFFF0000FFFF0000h
mov rbx,2
mul rbx
; RDX:RAX = 0000000000000001FFFE0001FFFE0000
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 36
MUL Examples
100h * 2000h, using 16-bit operands:
.data
val1 WORD 2000h
val2 WORD 100h
.code
mov ax,val1
mul val2
; DX:AX = 00200000h, CF=1
The Carry flag indicates
whether or not the upper
half of the product
contains significant digits.
12345h * 1000h, using 32-bit operands:
mov eax,12345h
mov ebx,1000h
mul ebx
; EDX:EAX = 0000000012345000h, CF=0
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 37
Your turn . . . (6 of 16)
What will be the hexadecimal values of DX, AX, and the
Carry flag after the following instructions execute?
mov ax,1234h
mov bx,100h
mul bx
DX = 0012h, AX = 3400h, CF = 1 (upper half
contains significant digit)
123400h = 1192960d
4660d * 256d = 1192960d
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 38
Your turn . . . (7 of 16)
What will be the hexadecimal values of EDX, EAX, and the
Carry flag after the following instructions execute?
mov eax,00128765h
mov ecx,10000h
mul ecx
EDX = 00000012h, EAX = 87650000h, CF = 1
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 39
IMUL Instruction
• IMUL (signed integer multiply) multiplies an 8-, 16-, or 32bit signed operand by either AL, AX, or EAX
• Preserves the sign of the product by sign-extending it into
the upper half of the destination register
Example: multiply 48 * 4, using 8-bit operands:
mov al,48
mov bl,4
imul bl
; AX = 00C0h, OF=1
OF=1 because AH is not a sign extension of AL.
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 40
IMUL Examples
Multiply 4,823,424 * -423:
mov eax,4823424
mov ebx,-423
imul ebx
; EDX:EAX = FFFFFFFF86635D80h, OF=0
OF=0 because EDX is a sign extension of EAX.
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 42
Your turn . . . (8 of 16)
What will be the hexadecimal values of DX, AX, and the Carry
flag after the following instructions execute?
mov ax,8760h
mov bx,100h
imul bx
DX = FF87h, AX = 6000h, OF = 1
876000h = 8871936d
34656d * 256d = 8871936d
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 43
DIV Instruction
• The DIV (unsigned divide) instruction performs 8-bit, 16bit, and 32-bit division on unsigned integers
• A single operand is supplied (register or memory operand),
which is assumed to be the divisor
• Instruction formats:
DIV reg/mem8
Default Operands:
DIV reg/mem16
DIV reg/mem32
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 44
DIV Examples
Divide 8003h by 100h, using 16-bit operands:
mov dx,0
mov ax,8003h
mov cx,100h
div cx
; clear dividend, high
; dividend, low
; divisor
; AX = 0080h, DX = 3
32771 / 256 = 128d = 0080h
DX contains 3
Same division, using 32-bit operands:
mov edx,0
mov eax,8003h
mov ecx,100h
div ecx
; clear dividend, high
; dividend, low
; divisor
; EAX = 00000080h, DX = 3
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 45
Your turn . . . (9 of 16)
What will be the hexadecimal values of DX and AX after the following
instructions execute? Or, if divide overflow occurs, you can indicate that
as your answer:
mov dx,0087h
mov ax,6000h
mov bx,100h
div bx
; 135d
; 24576d
; 256d
10000111 high
0110000000000000
100000000
DX = 0000h, AX = 8760h
DX – 0d, AX = 34656d
10000111 011000000000000 / 100000000 = 1000011101100000
8871936d / 256d = 34656d
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 47
Signed Integer Division (IDIV)
• Signed integers must be sign-extended before division
takes place
– fill high byte/word/doubleword with a copy of the low
byte/word/doubleword’s sign bit
• For example, the high byte contains a copy of the sign bit
from the low byte:
10001111
11111111
10001111
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 49
CBW, CWD, CDQ Instructions
• The CBW, CWD, and CDQ instructions provide important
sign-extension operations:
– CBW (convert byte to word) extends AL into AH
– CWD (convert word to doubleword) extends AX into DX
– CDQ (convert doubleword to quadword) extends EAX into EDX
• Example:
.data
dwordVal SDWORD -101
; FFFFFF9Bh
.code
mov eax,dwordVal
cdq
; EDX:EAX = FFFFFFFFFFFFFF9Bh
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 50
IDIV Instruction
• IDIV (signed divide) performs signed integer
division
• Same syntax and operands as DIV instruction
Example: 8-bit division of –48 by 5
mov al,-48
cbw
mov bl,5
idiv bl
; extend AL into AH
; AL = -9, AH = -3
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 51
IDIV Examples
Example: 16-bit division of –48 by 5
mov ax,-48
cwd
mov bx,5
idiv bx
; extend AX into DX
; AX = -9, DX = -3
Example: 32-bit division of –48 by 5
mov eax,-48
cdq
mov ebx,5
idiv ebx
; extend EAX into EDX
; EAX = -9, EDX = -3
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 52
Your turn . . . (11 of 16)
What will be the hexadecimal values of DX and AX after the
following instructions execute? Or, if divide overflow occurs,
you can indicate that as your answer:
mov ax,0FDFFh
cwd
mov bx,100h
idiv bx
; -513
DX = FFFFh (-1), AX = FFFEh (-2)
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 53
Unsigned Arithmetic Expressions
• Some good reasons to learn how to implement integer
expressions:
– Learn how do compilers do it
– Test your understanding of MUL, IMUL, DIV, IDIV
– Check for overflow (Carry and Overflow flags)
Example: var4 = (var1 + var2) * var3
; Assume unsigned operands
mov eax,var1
add eax,var2
; EAX = var1 + var2
mul var3
; EAX = EAX * var3
jc TooBig
; check for carry
mov var4,eax
; save product
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 54
Signed Arithmetic Expressions (1 of 2)
Example: eax = (-var1 * var2) + var3
mov eax,var1
neg eax
imul var2
jo TooBig
add eax,var3
jo TooBig
; check for overflow
; check for overflow
Example: var4 = (var1 * 5) / (var2 – 3)
mov eax,var1
mov ebx,5
imul ebx
mov ebx,var2
sub ebx,3
idiv ebx
mov var4,eax
; left side
; EDX:EAX = product
; right side
; EAX = quotient
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 55
Your turn . . . (12 of 16)
Implement the following expression using signed
32-bit integers:
eax = (ebx * 20) / ecx
mov eax,20
imul ebx
idiv ecx
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 57
Your turn . . . (13 of 16)
Implement the following expression using signed
32-bit integers: Save and restore ECX and EDX:
eax = (ecx * edx) / eax
push edx
push eax
mov eax,ecx
imul edx
pop ebx
idiv ebx
pop edx
; EAX needed later
; left side: EDX:EAX
; saved value of EAX
; EAX = quotient
; restore EDX, ECX
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 58
Your turn . . . (14 of 16)
Implement the following expression using signed
32-bit integers. Do not modify any variables other
than var3:
var3 = (var1 * -var2) / (var3 – ebx)
mov eax,var1
mov edx,var2
neg edx
imul edx
mov ecx,var3
sub ecx,ebx
idiv ecx
mov var3,eax
; left side: EDX:EAX
; EAX = quotient
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 59
What’s Next (3 of 5)
• Shift and Rotate Instructions
• Shift and Rotate Applications
• Multiplication and Division Instructions
• Extended Addition and Subtraction
• ASCII and UnPacked Decimal Arithmetic
• Packed Decimal Arithmetic
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 60
Summary
• Shift and rotate instructions are some of the best tools of
assembly language
– finer control than in high-level languages
– SHL, SHR, SAR, ROL, ROR, RCL, RCR
• MUL and DIV – integer operations
– close relatives of SHL and SHR
– CBW, CDQ, CWD: preparation for division
• 32-bit Mode only:
– Extended precision arithmetic: ADC, SBB
– ASCII decimal operations (AAA, AAS, AAM, AAD)
– Packed decimal operations (DAA, DAS)
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 86
Extra
55 74 67 61 6E 67 65 6E
Utgangen
End (Norwegian)
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 87
Copyright
This work is protected by United States copyright laws and is
provided solely for the use of instructors in teaching their
courses and assessing student learning. Dissemination or sale of
any part of this work (including on the World Wide Web) will
destroy the integrity of the work and is not permitted. The work
and materials from it should never be made available to students
except by instructors using the accompanying text in their
classes. All recipients of this work are expected to abide by these
restrictions and to honor the intended pedagogical purposes and
the needs of other instructors who rely on these materials.
Copyright © 2020, 2015, 2011 Pearson Education, Inc. All Rights Reserved
7 – 88