**Multiplication instructions in MASM**

The process of multiplying and dividing is different for signed and unsigned numbers. So they use different instructions. The intructions are also of byte and word form. When we multiply 2 numbers of byte form the result will be word form or 2 bytes. When we multiply 2 number of word form the result is double word. The basic multiplication instructions are -

**MUL (Multiply)**

MUL (Multiply) is used for multiplying unsigned numbers. The form of invokation is-

MUL source

The instruction shall multiply the value of AL/AX with source and store it in DX:AX. The source may be a register or a memory byte but not a constant number. To invoke a byte form of multiplication the source should be 8bit and the destination should be in AL. For word form of multiplication the source is 16bit and the destination is stored in AX. In this case the result is stored in AX(lower word) and DX(upper word)

**Example**

**Byte form of MUL**

Suppose AL contains 80h and BL contains 0ffh

MUL BL

**Dec Product Hex Product AH AL CF/OF**

128 7F80 7F 80 1*

**Word form of MUL**

Suppose AX contains FFFh and BX contains FFFFh

MUL BX

**Dec Product Hex Product DX AX CF/OF**

4294836225 FFFE0001 FFFE 0001 1*

**IMUL (Integer Multiply)**

IMUL is used for multiplying signed numbers. The form of invokation is-

IMUL source

The instruction shall multiply the value of AX /ALwith source and store it in AX/DX:AX. The source may be a register or a memory byte but not a constant number. To invoke a byte form of multiplication the source should be 8bit and the destination should be in AL. For word form of multiplication the source is 16bit and the destination is stored in AX. In this case the result is stored in AX(lower word) and DX(upper word)

**Example**

**Byte form of IMUL**

Suppose AL contains 80h and BL contains 0ffh

MUL BL

**Dec Product Hex Product AH AL CF/OF**

128 0080 00 80 1*

**Word form of IMUL**

Suppose AX contains FFFh and BX contains FFFFh

IMUL BX

**Dec Product Hex Product DX AX CF/OF**

1 00000001 0000 0001 0*

*Effect of MUL and IMUL in CF and OF

after invoking MUL and IMUL the flags SF,ZF,AF,PF are unchanged. The flags CF and OF are changed as-

After MUL CF/OF = 0 if upper half of the result is 0

= 1 other wise

After IMUL CF/OF = 0 if the upper half of the result is the sign extension of the lower half

= 1 otherwise

For both case the CF/OF =1 means that the result is too big to fit in the lower half of destination.

**Division instructions in MASM**

The process of dividing is also different for signed and unsigned numbers. So they use different instructions. The intructions are also of byte and word form. When we divide a number of word form with a divider of byte form the result is also a byte form. We can also divide a 32 bit dividend by a 16 bit divisor. In this case the dividend is in DX:AX. The instructions are -

**DIV (Divide)**

DIV is used for unsigned division. The form is-

DIV divisor

The instruction shall divide the value of AX/DX:AX with divisor and store the quotient in AL/AX and remainder in AH/DX. The divisor may be a register or a memory location but not a constant number.

**Example**

**Word form of DIV**

Suppose AX contains 00FBh and BL contains FFh

DIV BL

**Dec Quotient Dec Remainder AH AL**

0 251 FBh 00h

**Double Word form of DIV**

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

DIV BX

**Dec Quotient Dec Remainder AH AL**

2 1 0002h 0001h

**IDIV (Integer Divide)**

IDIV is used for dividng signed numbers. The form is-

IDIV divisor

The instruction shall divide the signed value of AX/DX:AX with divisor and store the quotient in AL/AX and remainder in AH/DX. The divisor may be a register or a memory location but not a constant number.

**Example**

**Word form of IDIV**

Suppose AX contains 00FBh and BL contains FFh

IDIV BL

**Dec Quotient Dec Remainder AH AL**

Dvide overflow** ** ** **

**Double Word form of IDIV**

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

IDIV BX

**Dec Quotient Dec Remainder AH AL**

-2 1 FFFEh 0001h

**Division overflow

It is possible that overflow might occur when diving, because the quotient and reminder are set to be half of the dividend by default. In any case were the divisor is so much small that can cause a larger result causes overflow. In the example above the dividend is FBh = 251 and the divisor is -1 so the quotient should be -251 which cannot be fit in AL

**Division overflow

It is possible that overflow might occur when diving, because the quotient and reminder are set to be half of the dividend by default. In any case were the divisor is so much small that can cause a larger result causes overflow. In the example above the dividend is FBh = 251 and the divisor is -1 so the quotient should be -251 which cannot be fit in AL

## No comments:

## Post a Comment