当前位置: 汇编教程 > 03-指令系统 > 阅读正文

汇编 div指令

2021.7.12.   803 次   1001字

div指令是除法指令,在使用div指令时

  • 除数:8位或者16位,在寄存器或内存单元中
  • 被除数:(默认)放在AX 或 DX和AX中

为什么说或?当除数为8位时,被除数应该是16位的,默认放在AX中,而当除数为16位,则被除数为32位,高位DX,低位AX

在汇编中,做乘法时,实际是加法模拟的,而除法,则是乘法模拟的,例如38/6,它先使用6*1,查看是否等于38,接着再加6,发现还小于38,则说明余数大于6,向上取6*2,直到最后得到商为6,余数2(这个过程只是大概推测,这里仅说明结果会得到商+余数)

对于div的结果,

  • 除数为8位,则商(AL)为8位,余数(AH)为8位
  • 除数为16位,则商(AX)为16位,余数(DX)为16位

div语法

div reg         ; reg表示一个寄存器,例如ax,bx
div 内存单元

div实例

div 内存单元8位实例

div byte ptr ds:[0]  

该指令,使用了ds:[0]作为地址,byte ptr表示取一个字节( 8位 ),那么除数是8位,则默认的被除数是ax

则得到的商,存放在al中,余数存放在ah中

div 内存单元16位实例

div word ptr es:[0]

在这里,使用了附加栈寄存器es,这里的word ptr表示取es:[0]处的一个字单元( 16位 )做除数,被除数是 dx*10000H+ax

结果中的商存放在ax中,余数存放在dx中

用除法指令完成100001/100

mov dx,1
mov ax,86A1H;
mov bx,100
div bx

这里,由于100001大于2^16-1=65535,要使用ax+dx存储,100001转换为186A1H,则dx存储1,ax存储86A1H

得到的结果,ax=03E8H(即商1000),dx=1(余数)

用除法指令计算1001/100

由于被除数是16位,则除数为8位

mov ax, 1001
mov bl, 100
div bl

可以得到al=0AH(即商10),ah=1(余数)

在编程中,如何更方便的对大数字进行除法?

伪指令dd

伪指令dd和 dw,db相似,但它定义的是双字型单元。即它本身占有32位

假设依然是上述的100001/100

data segment
 dd 100001
 dw 100
 dw 0
data ends

定义了三个字段,分别是被除数,除数,和商

mov ax, data
move ds,ax
mov ax,ds:[0]
mov dx,ds:[0]
div word ptr ds:[4]
mov ds:[6],ax

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群