实验10(2)求帮忙
assume cs:code,ss:stackstack segment
dw 8 dup(0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,10h
mov ax,4240h
mov dx,0fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw: push ax
mov ax,dx
mov dx,0 ;为什么此处的dx需要清零
div cx
mov bx,ax
pop ax
div cx ;而此处的dx确不需要清零
mov cx,dx
mov dx,bx
ret
code ends
end start 说明: 1. 其中OPRD为任一个通用寄存器或存储器操作数.
----
2. 字节相除,被除数在AX中;字相除,被除数在DX,AX中,除数在OPRD中.
字节除法: (AL)<--(AX)/OPRD,(AH)<--(AX)MOD OPRD
字除法: (AX)<--(DX)(AX)/OPRD,(DX)<--(DX)(AX) MOD OPRD
3. 示例: DIV BETA
DIV CX;商在AX中,余数在DX中
DIV BL;商在AL中,作数在AH中
DX清不清0。要看你实现什么功能。 本帖最后由 吃货YA鸭 于 2017-6-20 13:52 编辑
都是拿ax除与cx,还都是32位除16的,也就是说结果商在ax中,余数在dx中。这两个除有什么区别?
两次div执行前的dx都是有值的,第一次是fh,必须清零div才不溢出,而第二次div执行前,dx同样有值,确不需要清零。 吃货YA鸭 发表于 2017-6-20 13:49
都是拿ax除与cx,还都是32位除16的,也就是说结果商在ax中,余数在dx中。这两个除有什么区别?
两次div ...
DIV除
除数: 8位或16位 在寄存器或内存单元中
被除数÷除数=商
被除数 除数 商 余数
AX 16位 BH-BL 8位 AL AH
(DX 高位 + AX 低位) 32位 BX 16位 AX DX
你这里
mov ax,dx
mov dx,0
div cx ;用32位(dx+ax)除以16位(bx) 商在ax中, 余数在dx中
这里把dx清零,明显就是用ax16位转成(dx+ax)32们除;以便为后面的除做准备
mov bx,ax;把ax放入bx中
pop ax ;弹出ax的值
div cx ;用32位(dx+ax)除以16位(bx) 商在ax中, 余数在dx中
这里dx是上一除的余数,ax是之前压入栈的值,bx则是上一除的商
这么详细你应该看得懂了。 吃货YA鸭 发表于 2017-6-20 13:49
都是拿ax除与cx,还都是32位除16的,也就是说结果商在ax中,余数在dx中。这两个除有什么区别?
两次div ...
我在做的时候是用10进制的1110/10,ax=10,dx=11,cx=10,用同样的规则与方法计算,书写完计算过程,就明白了,再用16进制做就简单了。这也算是投机取巧吧。 本帖最后由 吃货YA鸭 于 2017-6-21 08:38 编辑
ba21 发表于 2017-6-20 17:36
DIV除
除数: 8位或16位 在寄存器或内存单元中
没看懂,反正我知道了,管它怎么样,先清空了再说。不过谢了! 我懂了,
原来第二次的div cx 是这个意思,(dx*65536+ax)/cx,
我原先一直都以为就是用ax/cx就完事了,刚在算了一下,加上了dx结果就对了。
忽略了,第一次div取余的重要性。
页:
[1]