div 指令
div 是除法指令,后面跟的是除数,被除数默认在 ax, 或者 dx、ax 组成的存储单元中。
-
除数可以有 8 位和 16 位两种,存储于一个 reg 或内存单元中,也就是说不可以 div 后面跟着 idata
-
被除数默认放在 ax 或者 dx 和 ax 中
- 如果除数是 8 位,而被除数可以是 16 位或者 32 位,那么被除数选择 16 位
- 如果除数是 8 位,而被除数必须是 32 位,那么除数选择 16 位,被除数 32 位
- 如果除数是 16 位, 而被除数可以是 16 位或者 32 位,那么被除数选择 32 位
- 现在还没有讲到 32 位的除法...
被除数为 32 位时,dx 存放高 16 位,ax 存放低 16 位
-
如果除数是 8 位的,那么 al 储存除法的商,ah 储存除法操作的余数 ;如果除数为 16 为,则 ax 存储除法操作的商,dx 存储除法操作的余数
问题 8.1
用 div 计算 data 段中的第一个数据除以第二个数据后的结果,商存在第三个数据的存储单元中。
data segment
dd 100001
dw 100
dw 0
data ends
分析
题目中的被除数是 100001 而除数是 100,它们的十六进制分别是 186A1 和 64,见除数可以使用 8 位去存放,但是被除数必须使用 32 位才可以存放(它有 5 个十六进制位,共 20bits)。那么最终,除数必须使用 16 位去存放。
所以代码如下:
mov ax, data
mov ds, ax
mov ax, ds[0] ; 低 16 位
mov dx, ds[2] ; 高 16 位
div word ptr ds:[4] ; 除数必须是一个字,16 位
mov ds[6], ax ; 保存商
浙公网安备 33010602011771号