鱼C论坛

 找回密码
 立即注册
查看: 3299|回复: 2

[争议讨论] 【实验十】2.解决除法溢出问题

[复制链接]
发表于 2012-4-20 00:41:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Beng! 于 2012-4-20 00:50 编辑

绞尽脑汁想出来的方法
有点繁琐,不知道谁有比较好的方法 学习一下
我的程序如下:
  1. ;X/N=int(H/N)*10000H+[rem(H/N)*1000H+L]/N
  2. assume cs:code

  3. stack segment
  4. dw 10 dup (0)
  5. stack ends

  6. code segment

  7. start:mov ax,stack
  8. mov ss,ax
  9. mov sp,20
  10. mov ax,0

  11. mov ax,4240h
  12. mov dx,000fh
  13. mov cx,0ah
  14. call divdw ;(sp)=(x)
  15. mov ax,4c00h
  16. int 21h

  17. divdw:push ax  ;(sp)=(x-2)
  18. push dx  ;(sp)=(x-4)
  19. ;思路是先计算 int(H/N)*10000H的值,再计算[rem(H/N)*1000H+L]/N 的值。
  20. ;int(H/N)*10000H=int(H/N)*8000H*2
  21. pop ax          ;取出H ;(sp)=(x-2)
  22. mov dx,0      ;初始化DX
  23. div cx            ;H/N 取商ax=1,dx=5

  24. mov bx,8000h
  25. mul bx         ;高位dx,低位ax
  26. sub sp,2       ;(sp)=(x-4)
  27. push dx       ;保存高位dx,(sp)=(sp-6)
  28. mov bx,2
  29. mul bx         ;高位dx1,低位ax1(一定为0)
  30. pop ax         ;取出dx,(sp)=(x-4)
  31. push dx       ;保存dx1,(sp)=(sp-6)
  32. mul bx         ;高位dx2(一定为0),低位ax2
  33. pop bx        ;(sp)=(x-4)
  34. add ax,bx   ;完成 int(H/N)*1000H
  35. push ax      ;保存 int(H/N)*1000H 的值,(sp)=(x-6)

  36. add sp,2     ;(sp)=(x-4)
  37. pop ax       ;取出H(sp)=(x-2)
  38. div cx         ;取余数 dx
  39. mov ax,dx
  40. mov bx,8000h
  41. mul bx       ;高位dx,低位ax
  42. sub sp,4     ;(sp)=(x-6)
  43. push dx     ;保存高位dx,(sp)=(x-8)
  44. mov bx,2
  45. mul bx       ;高位dx1,低位ax1(一定为0)
  46. pop ax       ;取出dx,(sp)=(x-6)
  47. push dx     ;保存dx1,(sp)=(x-8)
  48. mul bx      ;高位dx2(一定为0),低位ax2
  49. pop bx      ;(sp)=(x-6)
  50. add ax,bx ;完成 rem(H/N)*1000H

  51. add sp,4    ;(sp)=(x-2)
  52. mov dx,ax ;将高位转移到dx
  53. pop ax      ;取出L(sp)=(x),完成[rem(H/N)*1000H+L]
  54. div cx        ;[rem(H/N)*1000H+L]/N


  55. sub sp,6   ;(sp)=(x-6)
  56. pop dx    ;(sp)=(x-4)
  57. add sp,4  ;(sp)=(x)
  58. ret

  59. code ends
  60. end start
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-20 12:35:10 | 显示全部楼层
本帖最后由 hxs554f 于 2012-4-20 12:36 编辑

;半年前写的,拿来分享一下
;设计一个子程序,用于解决除法溢出问题。被除数为dword型,除数为word型
assume cs:code,ds:date
date segment
  dd 33333333h             ;放置被除数
  dw 2222h              ;放置除数
  db 16 dup (0)  ;用于存放结果,低8位放商,高8位放余数
date ends
code segment
start:   mov ax,date
         mov ds,ax
                 call s
                 mov ax,4c00h
                 int 21h
        s:          mov bx,0   
                 mov cx,[bx+4]     ;放置除数 注意这是数字,两个数字为一个字节
                 mov ax,[bx+2]     ;将被除数的高8位放在ax中
                 mov dx,0           ;将dx置零
                 div cx
                 push ax          ;将高位的除法结果保护起来
                                
                 mov ax,[bx]           ;将被除数的低8位放在ax中
         div cx           ;注意,16位除法默认dx放高位,ax放低位。
                   ;而之前除法的余数是放在dx中   公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
                 mov [bx+14],dx     ;将结果的余数放入
                 mov [bx+10],ax       ;将商的低位放入
                 pop ax
                 mov [bx+6],ax      ;将商的高位放入
                 ret
code ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-20 14:58:37 | 显示全部楼层

终于看明白内个公式是怎么回事了~
谢谢亲
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 08:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表