CLASS16
CLASS16
32
Multiplication and Division Instructions
• MUL Instruction
• IMUL Instruction
• DIV Instruction
• Signed Integer Division
• CBW, CWD, CDQ Instructions
• IDIV Instruction
• Implementing Arithmetic Expressions
33
MUL Instruction
• In 32-bit mode, MUL (unsigned multiply) instruction multiplies an
8-, 16-, or 32-bit operand by either AL, AX, or EAX.
34
64-Bit MUL Instruction
• In 64-bit mode, MUL (unsigned multiply) instruction multiplies a
64-bit operand by RAX, producing a 128-bit product.
Example:
mov rax,0FFFF0000FFFF0000h
mov rbx,2
mul rbx ; RDX:RAX = 0000000000000001FFFE0001FFFE0000
35
MUL Examples
mov eax,12345h
mov ebx,1000h
mul ebx ; EDX:EAX = 0000000012345000h, CF=0
36
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
37
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
38
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
39
Using IMUL in 64-Bit Mode
• You can use 64-bit operands. In the two-operand
format, a 64-bit register or memory operand is
multiplied against RDX
• 128-bit product produced in RDX:RAX
• The three-operand format produces a 64-bit product
in RAX
.data
multiplicand QWORD -16
.code
imul rax, multiplicand, 4 ; RAX = FFFFFFFFFFFFFFC0 (-64)
40
IMUL Examples
41
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
42
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
43
DIV Examples
44
64-Bit DIV Example
Divide 000001080000000033300020h by
00010000h:
.data
dividend_hi QWORD 00000108h
dividend_lo QWORD 33300020h
divisor QWORD 00010000h
.code
mov rdx, dividend_hi
mov rax, dividend_lo
div divisor ; RAX = quotient
; RDX = remainder
quotient: 0108000000003330h
remainder: 0000000000000020h
45
Your turn . . .
mov dx,0087h
mov ax,6000h
mov bx,100h
div bx
DX = 0000h, AX = 8760h
46
Your turn . . .
mov dx,0087h
mov ax,6002h
mov bx,10h
div bx
Divide Overflow
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
48
CBW, CWD, CDQ Instructions
49
IDIV Instruction
50
IDIV Examples
51
Your turn . . .
52
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)
53
Signed Arithmetic Expressions (1 of 2)
54
Signed Arithmetic Expressions (2 of 2)
55
Your turn . . .
mov eax,20
imul ebx
idiv ecx
56
Your turn . . .
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
57
Your turn . . .
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
58