Multiplication & division instructions microprocessor 8086

Post on 15-Jul-2015

478 views 14 download

Transcript of Multiplication & division instructions microprocessor 8086

TOPIC:MULTIPLICATION AND DIVISION

Group member:

M Hamza Nasir

(12063122-067)

M Usaman Ali

(12063122-086)

Syed Farhan Abbas

(12063122-009)

M Faran Ali

(12063122-055)

Ateeb Saeed

(12063122-094)

University Of Gujrat

Multiplication

MUL(unsinged)

IMUL(singed)

MUL INSTRUCTION(UNSIGNED MULTIPLY)

Multiplies an 8-, 16-, or 32-bit operand by

either AL, AX

Syntax:MUL AL R/M8

Syntax: MUL AX R/M16

MUL INSTRUCTIONNote that the product is stored in a register (or

group of registers) twice the size of the operands.

The operand can be a register or a memory operand

MUL INSTRUCTION

MUL EXAMPLES

Mov al, 5h

Mov bl, 10h

Mul bl ; AX = 0050h, CF = 0

No overflow - the Carry flag is 0 because the

upper half of AX is zero

IMUL INSTRUCTION(SIGNED MULTIPLY)

same syntax

uses the same operands as the MUL

instruction

preserves the sign of the product

Opcode=IMUL

IMUL INSTRUCTION

Suppose AX contains 1 and BX contains FFFFh

Mov AX, 1h

Mov BX, FFFFh

IMUL BX ;

Decimal product=-1,

Hex Product =FFFFFFFFh

DX = FFFFh, AX=FFFFh CF/OF=0

DX is a sign extension of AX for this CF/OF=0

IMUL INSTRUCTION

IMUL sets the Carry and Overflow flags if the

high-order product is not a sign extension of

the low-order product

Mov al, 48

Mov bl, 4

Imul bl ;AX = 00C0h, OF = 1

AH is not a sign extension of AL, so the

Overflow flag is set

IMUL INSTRUCTION

Suppose AX contains FFFFh and BX contains FFFFh

Mov AX, FFFFH

Mov BX, FFFFh

IMUL BX

Decimal product=1

Hex Product = 00000001 h

DX = 0000h, AX=0001h CF/OF=0

DX is a sign extension of AX for this CF/OF=0

IMUL INSTRUCTION

Suppose AX contains 0FFFh.and BX contains 0FFFh

Mov AX, 0FFFH

Mov BX, 0FFFh

IMUL BX

Decimal product=16769025

Hex Product = 00FFE001 h

DX = 00FFh, AX=E001h CF/OF=0

DX is a not sign extension of AX for this CF/OF=1

IMUL INSTRUCTION

Suppose AL contains 80h.and BL contains FFh

Mov AL, 80H

Mov BL, FFh

IMUL BL

Decimal product=128,

Hex Product = 0080 h

AH = 00h, AL=80h CF/OF=01

DX is a not sign extension of AX for this CF/OF=1

APPLICATION OF MUL AND IMUL

Translate the high level language assignment

statement

A=5×A-12×B

Let A and B be word variables, and suppose

there is no overflow.

Use IMUL for multiplication

SOLUTION:

Mov AX,5 ;AX=5

IMUL A ;AX=5*A

MOV A,AX ;A=5*A

MOV AX,12 ;AX=12

IMUL B ;AX=12*B

SUB A,AX ;5*A-12*B

DIVIDE

DIV(unsinged) IDIV(singed)

DIVIDE AND IDIVIDE

When division is performed we obtain two

results

The quotient and

The remainder.

Similarly like Multiplication there are separate

instructions for unsigned and signed division

CONT..

Syntax:

DIV divisor

IDIV divisor

Byte Form:

The divisor is eight bit register or memory byte

The 16 – bit dividend is assumed to be in AX. After division 8-bit quotient is in AL and 8-bit remainder in AH.

CONT..

Word Form:

The divisor is a 16-bit register or memory word

The 32-bit dividend is assumed to be in DX:AX

After division, the 16-bit quotient is in AX and 16-

bit remainder is in DX

Effect on flags:

All status flags are undefined

CONT..

Divide Overflow:

It is possible that the quotient s too big to fit

in the specified destination(AL or AX).

This Happens Because the divisor is much

smaller than the dividend.

When this Happens the program terminates

and system displays message “divide overflow”

CONT..

Examples:

EXAMPLE 9.8:

Suppose DX contains 0000h , AX contains 0005h, and BX contains 0002h.

EXAMPLE 9.9:

Suppose DX contains 0000h , AX contains 0005h and BX contains FFFEh.

EXAmple 9.10:

Suppose AX contains 00FBh and BL contains FFh.

DECIMAL INPUT AND OUTPUT

Computer represent every thing in binary

But it is convenient for user to represent

input and output in decimal

If we input 21543 character string then it

must to converted internally

Conversely on output the binary contents of

R/M must be converted to decimal equivalent

before being printed

DECIMAL INPUT

Convert a string of ASCII digits to the binary representation of decimal equivalent

For input we repeatedly multiply AX by 10

Algorithm (First version):

Total=0

Read an ASCII

REPEATconvert character to number

Total=total*10+value

Read a character

Until character is carriage return

CONT..

Example: input of 123

Total =0

Read ‘1’

Convert ‘1’ to 1

Total=10*0 +1=1

Read ‘2’

Convert ‘2’ to 2

Total=10*1 +2=12

Read ‘3’

Convert ‘3’ to 3

Total=10*12 +3=123

CONT..

Range: -32768 to 32767

Optional sign followed by string of digits

& carriage return

Outside ‘0’ to ‘9’

jumps to new line and ask for input

again

CONT..Algorithm(second version):

total=0

Negative=false

Read a character

Case character of

• ‘-’: negative=true

read a character

• ‘+’: read a character

End_case

Repeat

If character is not between ‘0’ to ‘9’

Then

Go to beginning

CONT..Else

Convert character to binary value

Total=10*total+value

End_if

Read a character

Until character is carriage return

If negative =true

Then

total=-total

CONT..

Program(source code):

INDEC PROC

;READ NUMBER IN RANGE -32768 TO 32767

PUSH BX

PUSH CX

PUSH DX

@BEGIN:

;total =0

XOR BX,BX ;BX hold total

;negative =false

CONT..XOR CX,CX ;CX hold sign

;read char

MOV AH,1

INT 21H

;case char of

CMP AL,'-' ;minus sign

JE @MINUS ;yes,set sign

CMP AL,'+' ;plus sign

JE @PLUS ;yes,get another char

CONT..

JMP @REPEAT2 ;start processing char

@MINUS: MOV CX,1

@PLUS: INT 21H

;end case

@REPEAT2:

;if char. is between '0' and '9'

CMP AL,'0' ;char >='0'?

JNGE @NOT_DIGIT ;illegal char.

CONT..CMP AL,'9' ;char<='9' ?

JNLE @NOT_DIGIT

;then convert char to digit

AND AX,000FH

PUSH AX ;save number

;total =total *10 +digit

MOV AX,10

MUL BX

POP BX ;retrieve number

ADD BX,AX ;total =total *10

+digit

CONT..;read char

MOV AH,1

INT 21H

CMP AL,0DH ;CR

JNE @REPEAT2 ;no keep going

;until CR

MOV AX,BX ;store number

in AX

;if negative

OR CX,CX ;negative

number

CONT..

Jz @EXIT ;no,exit

;then

NEG AX ;yes,negate

;end if

@EXIT: ;retrieve registers

POP DX

POP CX

POP BX

RET

CONT..

;here if illegal char entered

@NOT_DIGIT:

MOV AH,2

MOV DL,0DH

INT 21H

MOV DL,0AH

INT 21H

JMP @BEGIN

INDEC ENDP

CONT..

Output:

INPUT OVERFLOW

AX:FFFFh

In decimal:65535

Range:-32768 to 32767

Anything out of range called input overflow

For example:

Input:32769

Total=327690

CONT..

Algorithm:

total=0

Negative=false

Read a character

Case character of

• ‘-’: negative=true

read a character

• ‘+’: read a character

CONT..

End_case

Repeat

If character is not between ‘0’ to ‘9’

Then

Go to beginning

Else

Convert character to binary value

Total=10*total

CONT..

If overflow

Then

go to beginning

Else

Total =total*10 +value

If overflow

Then

go to beginning

CONT..

End_if

End_if

End_if

Read a character

Until character is carriage return

If negative =true

Then

total=-total

CONT..

Code:

;total =total *10 +digit

MOV AX,10

MUL BX

CMP DX,0

JNE @NOT_DIGIT

POP BX

ADD BX,AX

JC @NOT_DIGIT

CONT..

Output:

Decimal Output

Algorithm for Decimal Output:

If AX < 0 /*AX holds output value */

THEN

Print a minus sign

Replace AX by its twos complement

End_IF

Get the digits in AX’s decimal representation

Convert these digits into characters and print

them

CONT..

To see what line 6 entitles, suppose the contents of AX, expressed in decimal is 24168. To get the digits in decimal representation , we can proceed as follows,

Divide 24618 by 10, Quotient= 2461, remainder=8

Divide 2461 by 10, Quotient= 246, remainder=1

Divide 246 by 10 , Quotient=24, remainder=6

Divide 24 by 10, Quotient=2, remainder=4

Divide 2 by 10, Quotient=0, remainder=2

CONT..

LINE 6:

Cout =0 /*will count decimal digit */

REPEAT

divide quotient by 10

Push remainder on the stack

Count= count +1

UNTILL

Quotient=0

CONT..

LINE 7:

FOR count times DO

Pop a digit from the stack

Convert it to a character

Output the character

END_FOR

CONT..

Program Listing PMG9_1.ASM

.MODEL SMALL

.STACK 100H

.CODE

OUTDEC PROC

;prints AX as a signed decimal integer

;input: AX

;output: none

PUSH AX ;save registers

PUSH BX

PUSH CX

PUSH DX

CONT..;if AX < 0

OR AX,AX ;AX < 0?

JGE @END_IF1 ;NO >0

;then

PUSH AX ; save number

MOV DL,’-’ ;get ‘-’

MOV AH,2 ;print character function

INT 21H ;print ‘-’

POP AX ;get Ax back

NEG AX ;AX= -AX

@END_IF1:

CONT..;get decimal digits

XOR CX,CX ;CX counts digits

MOV BX,10D ;BX has divisor

@REPEAT1:

XOR DX,DX ;prepare high word of dividend

DIV BX ;AX=quotient, DX=remainder

PUSH DX ;save remainder on stack

INC CX ;count = count +1

;until

OR AX,AX ;quotient = 0?

JNE @REPEAT ;no, keep going

CONT..;convert digits to character and print

MOV AH,2 ;print character function

;for count time do

@PRINT_LOOP

POP DX ;digit in DL

OR DL,30H ;convert to character

INT 21H ;print digit

;end_for

POP DX ; restore registers

POP CX

POP BX

POP AX

OUTDEC ENDP