(二十)div 指令(除法指令)和 mul 指令(乘法指令)--汇编笔记

汇编语言

Posted by YiMiTuMi on April 2, 2020

div指令(除法指令)

div是除法指令,使用div做除法的时候应注意一下问题:

  1)除数:有8位和16位两种,在一个reg(寄存器)或内存单元中。

  2)被除数:默认放在AXDX和AX中,如果除数为8位,被除数则为16位,默认存放在 AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放, DX存放高16位, AX存放低16位。

  3)结果:如果除数为8位,则AL存储除法操作的商, AH存储除法操作的余数;如果除数为16位,则 AX存储除法操作的商,DX存储除法操作的余数。

div格式:

div reg

div 内存单元

例:

div byte ptr ds:[0]

含义:(al)= (ax) / ((ds) * 16 + 0)的商
      (ah) = (ax) / ((ds) * 16 + 0)的余数


div word ptr es:[0]

含义: (ax) = [(dx * 10000H) + (ax)] / ((es) * 16 + 0) 的商
      (dx) = [(dx * 10000H) + (ax)] / ((es) * 16 + 0) 的余数


div byte ptr [bx + si + 8]

含义: (al) = (ax) / [(ds) * 16 + (bx) + (si) + 8] 的商
	(ah)= (ax) / [(ds) * 16 + (bx) + (si) + 8] 的余数
 

div word ptr [bx + si + 8]

含义:  (ax) = [(dx) * 10000H + (ax)] / [(ds) * 16 + bx + si + 8] 的商
	  (dx) = [(dx) * 10000H + (ax)] / [(ds) * 16 + bx + si + 8] 的余数 

编程:利用除法指令计算100001/100

  1)被除数100001大于65535,不能用ax寄存器存放,只能用dxax联合存放,即16位除法。

  2)除数100小于255,可以用一个8位寄存器存放,但是,因为被除数是32位的,除数应为16位,所以要用一个16位寄存器来存放除数100。

  3)100001表示为16进制为186A1H,因为要分为高位和低位存放。

实现:

mov dx, 1     //或 10000H

mov ax, 86A1H    //(dx) * 10000H + ax = 100001  

mov bx, 100

div bx

编程:利用除法指令计算1001/100

 1)1001可以用ax存放,100可以用8位寄存器存放,所以进行8位除法。

实现:

mov ax, 1001

mov bl, 100

div bl

mul指令(乘法指令)

mul乘法指令:

 1)两个相乘的数,两个相乘的数,要么都是8位,要么都是16位。

如果是8位,一个默认放在AL中,另一个放在8位reg或内存单元中。

如果是16位,一个默认在AX中,另一个放在16位的reg或内存单元中。

 2)结果:如果是8位乘法,结果默认放在AX中,结果高位默认放在DX中存放,低位在AX中放。

mul格式:

mul reg

mul 内存单元

例:

mul byte ptr ds:[0]

含义:(ax) = (al) * ((ds) * 16 + 0)


mul word ptr [bx + si + 8]

含义:

	(ax)= (ax) * ((ds) * 16 + (bx) + (si) + 8) //结果的低16位

	(dx)= (ax) * ((ds) * 16 + (bx) + (si) + 8) //结果的高16位

例:计算100 * 10

100 和 10小于255,可以做8位乘法。

mov al, 100

mov bl, 10

mul bl

结果:(ax) = 1000

例:计算100 * 10000

100小于255,但是10000大于255必须做16乘法。

mov ax, 10000

mov bx, 100

mul bx

结果:(ax)= 4240H (dx)= 000FH (F4240H = 1000000)

白色海芋花语 – 青春活力