preload preload preload preload

Sunday, January 24, 2010

Assembly Language Part 10

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

No comments:

Post a Comment