0% found this document useful (0 votes)
21 views63 pages

Week 10

Uploaded by

zainbakra1
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)
21 views63 pages

Week 10

Uploaded by

zainbakra1
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/ 63

Computer Organization

& Assembly Language


- EE2003
Lecture 16
Week 10
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

3
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
4
Logical Shift
▸ A logical shift fills the newly created bit position with zero:

5
Arithmetic Shift
• An arithmetic shift fills the newly created bit position
with a copy of the number’s sign bit:

6
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 (Same for all shift and
SHL mem,CL rotate instructions)

7
Fast Multiplication
Shifting left 1 bit multiplies a number by 2

mov dl,5
shl dl,1

Shifting left n bits multiplies the operand by 2n


For example, 5 * 22 = 20
mov dl,5
shl dl,2 ; DL = 20

8
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.

Shifting right n bits divides the operand by 2n


mov dl,80
shr dl,1 ; DL = 40
shr dl,2 ; DL = 10
9
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.

An arithmetic shift preserves the number's sign.


mov dl,-80
sar dl,1 ; DL = -40
sar dl,2 ; DL = -10 10
Your turn . . .
Indicate the hexadecimal value of AL after each shift:

mov al,6Bh
shr al,1 a. 35h
shl al,3 b. A8h
mov al,8Ch
sar al,1 c. C6h
sar al,3 d. F8h

11
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

mov al,11110000b
rol al,1 ; AL = 11100001b

mov dl,3Fh
rol dl,4 ; DL = F3h

12
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

mov al,11110000b
ror al,1 ; AL = 01111000b

mov dl,3Fh
ror dl,4 ; DL = F3h
13
Your turn . . .
Indicate the hexadecimal value of AL after each rotation:

mov al,6Bh
ror al,1 a. B5h
rol al,3 b. ADh

14
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

clc ; CF = 0
mov bl,88h ; CF,BL = 0 10001000b
rcl bl,1 ; CF,BL = 1 00010000b
rcl bl,1 ; CF,BL = 0 00100001b
15
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

stc ; CF = 1
mov ah,10h ; CF,AH = 1 00010000b
rcr ah,1 ; CF,AH = 0 10001000b
16
Your turn . . .
Indicate the hexadecimal value of AL after each rotation:

stc
mov al,6Bh
rcr al,1 a. B5h
rcl al,3 b. AEh

17
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
18
SHLD Example
Shift count of 1:
mov al,11100000b
mov bl,10011101b
shld al,bl,1

19
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
Before:
.code
mov ax,0AC36h After:
shld wval,ax,4

20
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
21
SHRD Example
Shift count of 1:
mov al,11000001b
mov bl,00011101b
shrd al,bl,1

22
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 Before:
shrd ax,dx,4
After:

23
Your turn . . .
Indicate the hexadecimal values of each destination
operand:

mov ax,7C36h
mov dx,9FA6h
shld dx,ax,4 ; DX = FA67h
shrd dx,ax,8 ; DX = 36FAh

24
What's Next
▸ Shift and Rotate Instructions
▸ Shift and Rotate Applications
▸ Multiplication and Division Instructions
▸ Extended Addition and Subtraction
▸ ASCII and Unpacked Decimal Arithmetic
▸ Packed Decimal Arithmetic

25
Shift and Rotate Applications
▸ Shifting Multiple Doublewords
▸ Binary Multiplication
▸ Displaying Binary Bits
▸ Isolating a Bit String

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
27
Binary Multiplication
▸ mutiply 123 * 36

28
Binary Multiplication
▸ 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 mov eax,123


= EAX * (32 + 4) mov ebx,eax
= (EAX * 32)+(EAX * 4) shl eax,5 ; mult by 25
shl ebx,2 ; mult by 22
add eax,ebx

29
Your turn . . .
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 ; AX * 16
push edx ; save for later
mov dx,ax
shl dx,3 ; AX * 8
shl ax,1 ; AX * 2
add ax,dx ; AX * 10
pop edx ; recall AX * 16
add ax,dx ; AX * 26

30
What's Next
▸ Shift and Rotate Instructions
▸ Shift and Rotate Applications
▸ Multiplication and Division Instructions
▸ Extended Addition and Subtraction
▸ ASCII and Unpacked Decimal Arithmetic
▸ Packed Decimal Arithmetic

31
Multiplication and Division
Instructions
▸ MUL Instruction
▸ IMUL Instruction
▸ DIV Instruction
▸ Signed Integer Division
▸ CBW, CWD, CDQ Instructions
▸ IDIV Instruction
▸ Implementing Arithmetic Expressions
32
MUL Instruction
▸ The 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

33
MUL Examples
100h * 2000h, using 16-bit operands:
The Carry flag
.data indicates whether or
val1 WORD 2000h not the upper half of
val2 WORD 100h the product contains
.code significant digits.
mov ax,val1
mul val2 ; DX:AX = 00200000h, CF=1

12345h * 1000h, using 32-bit operands:

mov eax,12345h
mov ebx,1000h
mul ebx ; EDX:EAX = 0000000012345000h, CF=0

34
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
mul bx

DX = 0012h, AX = 3400h, CF = 1

35
Your turn . . .
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

36
IMUL Instruction
▸ IMUL (signed integer multiply ) multiplies an 8-, 16-, or 32-bit 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.


37
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.

38
Your turn . . .
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

39
DIV Instruction
▸ The DIV (unsigned divide) instruction performs 8-bit, 16-bit, 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
DIV reg/mem16 Default Operands:
DIV reg/mem32

40
DIV Examples
Divide 8003h by 100h, using 16-bit operands:
mov dx,0 ; clear dividend, high
mov ax,8003h ; dividend, low
mov cx,100h ; divisor
div cx ; AX = 0080h, DX = 3

Same division, using 32-bit operands:

mov edx,0 ; clear dividend, high


mov eax,8003h ; dividend, low
mov ecx,100h ; divisor
div ecx ; EAX = 00000080h, DX = 3

41
Your turn . . .
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

DX = 0000h, AX = 8760h

42
Your turn . . .
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,6002h
mov bx,10h
div bx

Divide Overflow

43
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:

44
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 45
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 ; extend AL into AH
mov bl,5
idiv bl ; AL = -9, AH = -3

46
IDIV Examples
Example: 16-bit division of –48 by 5
mov ax,-48
cwd ; extend AX into DX
mov bx,5
idiv bx ; AX = -9, DX = -3

Example: 32-bit division of –48 by 5


mov eax,-48
cdq ; extend EAX into EDX
mov ebx,5
idiv ebx ; EAX = -9, EDX = -3

47
Your turn . . .
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 ; -513


cwd
mov bx,100h
idiv bx

DX = FFFFh (−1), AX = FFFEh (−2)

48
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 49
Signed Arithmetic
Expressions (1 of 2)
Example: eax = (-var1 * var2) + var3
mov eax,var1
neg eax
imul var2
jo TooBig ; check for overflow
add eax,var3
jo TooBig ; check for overflow

Example: var4 = (var1 * 5) / (var2 – 3)


mov eax,var1 ; left side
mov ebx,5
imul ebx ; EDX:EAX = product
mov ebx,var2 ; right side
sub ebx,3
idiv ebx ; EAX = quotient
mov var4,eax 50
Signed Arithmetic
Expressions (2 of 2)

Example: var4 = (var1 * -5) / (-var2 % var3);

mov eax,var2 ; begin right side


neg eax
cdq ; sign-extend dividend
idiv var3 ; EDX = remainder
mov ebx,edx ; EBX = right side
mov eax,-5 ; begin left side
imul var1 ; EDX:EAX = left side
idiv ebx ; final division
mov var4,eax ; quotient

Sometimes it's easiest to calculate the right-hand term of an


expression first.
51
Your turn . . .
Implement the following expression using signed 32-bit
integers:
eax = (ebx * 20) / ecx

mov eax,20
imul ebx
idiv ecx

52
Your turn . . .
Implement the following expression using signed 32-bit
integers. Save and restore ECX and EDX:
eax = (ecx * edx) / eax

push edx
push eax ; EAX needed later
mov eax,ecx
imul edx ; left side: EDX:EAX
pop ebx ; saved value of EAX
idiv ebx ; EAX = quotient
pop edx ; restore EDX, ECX

53
Your turn . . .
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 ; left side: EDX:EAX
mov ecx,var3
sub ecx,ebx
idiv ecx ; EAX = quotient
mov var3,eax

54
What's Next
▸ Shift and Rotate Instructions
▸ Shift and Rotate Applications
▸ Multiplication and Division Instructions
▸ Extended Addition and Subtraction
▸ ASCII and UnPacked Decimal Arithmetic
▸ Packed Decimal Arithmetic

55
Extended Addition and
Subtraction
▸ ADC Instruction
▸ Extended Precision Addition
▸ SBB Instruction
▸ Extended Precision Subtraction

56
Extended Precision Addition
▸ Adding two operands that are longer than the computer's word size (32
bits).
▹ Virtually no limit to the size of the operands
▸ The arithmetic must be performed in steps
▹ The Carry value from each step is passed on to the next step.

57
ADC Instruction
▸ ADC (add with carry) instruction adds both a source operand and the
contents of the Carry flag to a destination operand.
▸ Operands are binary values
▹ Same syntax as ADD, SUB, etc.
▸ Example
▹ Add two 32-bit integers (FFFFFFFFh + FFFFFFFFh), producing a
64-bit sum in EDX:EAX:
mov edx,0
mov eax,0FFFFFFFFh
add eax,0FFFFFFFFh
adc edx,0 ;EDX:EAX = 00000001FFFFFFFEh
58
Extended Addition Example
▸ Task: Add 1 to EDX:EAX
▹ Starting value of EDX:EAX: 00000000FFFFFFFFh
▹ Add the lower 32 bits first, setting the Carry flag.
▹ Add the upper 32 bits, and include the Carry flag.

mov edx,0 ; set upper half


mov eax,0FFFFFFFFh ; set lower half
add eax,1 ; add lower half
adc edx,0 ; add upper half

EDX:EAX = 00000001 00000000

59
SBB Instruction
▸ The SBB (subtract with borrow) instruction subtracts both a source
operand and the value of the Carry flag from a destination operand.
▸ Operand syntax:
▹ Same as for the ADC instruction

60
Extended Subtraction
Example
▸ Task: Subtract 1 from EDX:EAX
▹ Starting value of EDX:EAX: 0000000100000000h
▹ Subtract the lower 32 bits first, setting the Carry flag.
▹ Subtract the upper 32 bits, and include the Carry flag.

mov edx,1 ; set upper half


mov eax,0 ; set lower half
sub eax,1 ; subtract lower half
sbb edx,0 ; subtract upper half

EDX:EAX = 00000000 FFFFFFFF


61
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
▸ Extended precision arithmetic: ADC, SBB
▸ ASCII decimal operations (AAA, AAS, AAM, AAD)
▸ Packed decimal operations (DAA, DAS) 62
THANKS!
Any questions?
You can find me at:
▸ A.qadeer@nu.edu.pk
▸ Office #213, Visiting Hours Only

63

You might also like