今天一天都去忙第一个程序了。我好痛苦,
哎,继续做第二题吧,要不然这个月都解决不了了。
第10章,实验10。
2解决除法溢出的问题
我只能说我很愚钝,看了半宿,备注5,才稍稍懂那个公式怎么推出来的。我不禁感慨:TMD真牛逼。
巨人的肩膀上就是舒坦。
名称:divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
参数:dword型数据的低16位,dowrd型数据的高16位,cx为除数,
返回:dx=结果的高16位,ax=结果的低16位
CX=余数
公式为X/n=int(H/n)*65536+[rem(H/n)*65536+L]/n
assume code:cs data:ds
data segment
dw 16 dup (0)
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw:
mov ax,dx ;这里到
add dx,dx
div cx
mov ds:[0],ax ; 这里,计算了int(h/n)的值,保留商,存在DS:[0]中
mov ds:[2],dx ; 也到这里,计算求出了rem(h/n)的值,保留余,存在DS[0]中
mov ax,ds:[2]
mov bx,10000h
mul bx
mov bx,4240
add ax,bx
abc dx,ds[4]
div cx
mov ds:[6],dx ;余数存起来
mov ds:[8],ax ;商也存啦
mov ax,ds:[0]
mov bx,10000h
mul bx
add ax,ds:[8];低位
abc dx,ds:[10];高位
mov cx,ds:[6];余数
ret divdw
code ends
end start
就写完了。速度一流,质量基本上没保障啦。算了,这个就含糊点,错就错了呗,这程序不能上DOS实践,错误也是难免,再说我又是个小白。
大家如果有闲功夫,就替在下看看有没有错误,一起讨论吧。也好改正我的错误。
就连这样的半成半次品,我都拿出来晒了,大家还等什么,都发过来吧。让我们共同一起提高呗。 |