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