鱼C论坛

 找回密码
 立即注册
查看: 2993|回复: 15

实验7还没做除法就提示除法溢出!帮忙看看哪里出问题了!

[复制链接]
发表于 2011-9-28 20:54:37 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 gongheng 于 2011-9-28 22:09 编辑

下面是我写的实验7的源程序,不知道是怎么回事,单步执行的时候还没到除法的时候就提示除法溢出,我觉得是我的栈段有问题,但是我的能力实在有限,看不出来是哪里出了错,麻烦各位鱼友看看是哪里出了错,先谢谢了!!!

源程序:(源程序后面有debug单步执行的最后几步的结果)
==================================================================
data segment
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
        db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
        db '1993','1994','1995'
        ;16=0000 0010H
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,15257,17800
data ends

stack segment
        dw 2 dup (0)
stack ends

table segment
        ;年份:(0-53H)收入:(54H-0A7H)雇员:(0A8H-0D1H)
        db 21 dup('year summ ne ??')
table ends

code segment
start:        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov ax,stack
        mov ss,ax
        mov sp,2
        mov bx,0
        mov di,0
        mov si,0
        mov cx,21
        
s:        mov ax,ds:[bx]                        ;年份
        mov es:[di],ax
        mov ax,ds:[bx+2]
        mov es:[di+2],ax
        
        mov ax,ds:[54H+bx]                ;收入
        mov es:[5+di],ax
        mov dx,ds:[56H+bx]
        mov es:[7+di],dx
        
        push ax
        push dx
        
        mov ax,ds:[0A8H+si]                ;人数
        mov es:[0AH+di],ax
        
        pop dx
        pop ax
        
        div word ptr es:[0AH+di]        ;人均收入
        mov es:[0DH+di],ax
        
        add bx,4
        add di,15
        add si,2
        
        loop s
        
        mov ax,4c00H
        int 21H
code ends
end start
======================================================================
下面是debug单步执行最后几步的结果:
======================================================================
AX=0D57  BX=0000  CX=028D  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0D48  ES=0D38  SS=0D48  CS=0D6B  IP=0008   NV UP EI PL NZ NA PO NC
0D6B:0008 8EC0          MOV     ES,AX
-t

AX=0D57  BX=0000  CX=028D  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0D48  ES=0D57  SS=0D48  CS=0D6B  IP=000A   NV UP EI PL NZ NA PO NC
0D6B:000A B8560D        MOV     AX,0D56
-t

AX=0D56  BX=0000  CX=028D  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0D48  ES=0D57  SS=0D48  CS=0D6B  IP=000D   NV UP EI PL NZ NA PO NC
0D6B:000D 8ED0          MOV     SS,AX
-t

AX=0D56  BX=0000  CX=028D  DX=0000  SP=0002  BP=0000  SI=0000  DI=0000
DS=0D48  ES=0D57  SS=0D56  CS=0D6B  IP=0012   NV UP EI PL NZ NA PO NC
0D6B:0012 BB0000        MOV     BX,0000
-t

Divide overflow

Program terminated normally
-





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-28 21:14:15 | 显示全部楼层
应该mov sp,4吧,2肯定不对了,你定义的2个字就4个字节了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 21:24:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-28 21:30:36 | 显示全部楼层
你把栈去掉,我怎么看你代码里push ax   push dx多余的操作,不用栈对ax dx没什么影响啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 21:40:14 | 显示全部楼层
topcookie 发表于 2011-9-28 21:30
你把栈去掉,我怎么看你代码里push ax   push dx多余的操作,不用栈对ax dx没什么影响啊

不用栈ax会被前面的人数覆盖,我之前就没用栈,ax会被覆盖为3的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-28 21:46:09 | 显示全部楼层
你把人数那的代码和收入的代码换下位置不就行了,不用栈了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 21:50:42 | 显示全部楼层
topcookie 发表于 2011-9-28 21:46
你把人数那的代码和收入的代码换下位置不就行了,不用栈了

恩,我正在试,还没弄好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-28 21:59:27 | 显示全部楼层
调好了说下可以正常用不啊,唉,在保护模式下调试16位程序还是有诸多问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 22:07:50 | 显示全部楼层
本帖最后由 gongheng 于 2011-9-28 22:22 编辑
gongheng 发表于 2011-9-28 21:50
恩,我正在试,还没弄好

这个回复错了请看下面的正确回复!!!!!!!






想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 22:08:51 | 显示全部楼层
遗憾的是用栈没成功:(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 22:11:08 | 显示全部楼层
本帖最后由 gongheng 于 2011-9-28 22:25 编辑
topcookie 发表于 2011-9-28 21:59
调好了说下可以正常用不啊,唉,在保护模式下调试16位程序还是有诸多问题

终于弄出来了!谢谢你的帮助!!!
=====================================================================
源代码:(源代码后面有ES段的内存情况)
=====================================================================
data segment
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
        db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
        db '1993','1994','1995'
        ;16=0000 0010H
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,15257,17800
        dw 2 dup (0)
data ends

table segment
        ;年份:(0-53H)收入:(54H-0A7H)雇员:(0A8H-0D1H)
        db 21 dup('year summ ne ??')
table ends

code segment
start:        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov bx,0
        mov di,0
        mov si,0
        mov cx,21
        
s:        mov ax,ds:[bx]                        ;年份
        mov es:[di],ax
        mov ax,ds:[bx+2]
        mov es:[di+2],ax
        
        mov ax,ds:[54H+bx]                ;收入
        mov es:[5+di],ax
        mov dx,ds:[56H+bx]
        mov es:[7+di],dx
        mov word ptr ds:[0D2H],ax
        mov word ptr ds:[0D4H],dx
        
        mov ax,ds:[0A8H+si]                ;人数
        mov es:[0AH+di],ax

        mov ax,word ptr ds:[0D2H]
        mov dx,word ptr ds:[0D4H]

        div word ptr es:[0AH+di]        ;人均收入
        mov es:[0DH+di],ax
        
        add bx,4
        add di,15
        add si,2
        
        loop s
        
        mov ax,4c00H
        int 21H
code ends
end start
============================================================================
下面是运行后的内存情况,我算了下,是对的
============================================================================

AX=014D  BX=0054  CX=0000  DX=2580  SP=0000  BP=0000  SI=002A  DI=013BDS=0D48  ES=0D56  SS=0D48  CS=0D6A  IP=0059   NV UP EI PL NZ NA PO NC0D6A:0059 B8004C        MOV     AX,4C00

-d 0d56:0
0D56:0000  31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 31   1975 .... .. ..1
0D56:0010  39 37 36 20 16 00 00 00-20 07 00 20 03 00 31 39   976 .... .. ..19
0D56:0020  37 37 20 7E 01 00 00 20-09 00 20 2A 00 31 39 37   77 ~... .. *.197
0D56:0030  38 20 4C 05 00 00 20 0D-00 20 68 00 31 39 37 39   8 L... .. h.1979
0D56:0040  20 56 09 00 00 20 1C 00-20 55 00 31 39 38 30 20    V... .. U.1980
0D56:0050  40 1F 00 00 20 26 00 20-D2 00 31 39 38 31 20 80   @... &. ..1981 .
0D56:0060  3E 00 00 20 82 00 20 7B-00 31 39 38 32 20 A6 5F   >.. .. {.1982 ._
0D56:0070  00 00 20 DC 00 20 6F 00-31 39 38 33 20 91 C3 00   .. .. o.1983 ...



-d 0d56:80
0D56:0080  00 20 DC 01 20 69 00 31-39 38 34 20 C7 7C 01 00   . .. i.1984 .|..
0D56:0090  20 0A 03 20 7D 00 31 39-38 35 20 81 24 02 00 20    .. }.1985 .$..
0D56:00A0  E9 03 20 8C 00 31 39 38-36 20 8A 03 03 00 20 A2   .. ..1986 .... .
0D56:00B0  05 20 88 00 31 39 38 37-20 7C 47 05 00 20 D2 08   . ..1987 |G.. ..
0D56:00C0  20 99 00 31 39 38 38 20-EB 03 09 00 20 E9 0A 20    ..1988 .... ..
0D56:00D0  D3 00 31 39 38 39 20 CA-42 0C 00 20 C5 0F 20 C7   ..1989 .B.. .. .
0D56:00E0  00 31 39 39 30 20 18 0D-12 00 20 03 16 20 D1 00   .1990 .... .. ..
0D56:00F0  31 39 39 31 20 38 1F 1C-00 20 22 20 20 E0 00 31   1991 8... "  ..1



-d 0d56:100
0D56:0100  39 39 32 20 58 19 2A 00-20 16 2D 20 EF 00 31 39   992 X.*. .- ..19
0D56:0110  39 33 20 28 44 39 00 20-5E 38 20 04 01 31 39 39   93 (D9. ^8 ..199
0D56:0120  34 20 28 F0 46 00 20 99-3B 20 30 01 31 39 39 35   4 (.F. .; 0.1995
0D56:0130  20 68 97 5A 00 20 88 45-20 4D 01 00 00 00 00 00    h.Z. .E M......




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-28 22:26:08 | 显示全部楼层
        mov ax,ds:[0A8H+si]                ;人数
        mov es:[0AH+di],ax

        mov ax,ds:[54H+bx]                ;收入
        mov es:[5+di],ax
        mov dx,ds:[56H+bx]
        mov es:[7+di],dx
  
        div word ptr es:[0AH+di]        ;人均收入
        mov es:[0DH+di],ax
        
程序用上面的顺序应该就不用你加的下面的四行代码了,人数放在收入之前取出,你觉得呢

        mov word ptr ds:[0D2H],ax
        mov word ptr ds:[0D4H],dx  

        mov ax,word ptr ds:[0D2H]
        mov dx,word ptr ds:[0D4H]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 22:40:59 | 显示全部楼层
topcookie 发表于 2011-9-28 22:26
mov ax,ds:[0A8H+si]                ;人数
        mov es:[0AH+di],ax

恩,我试了下,正常运行,而且结果也一样,看来编程的确需要灵活的头脑才行啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-28 22:47:28 | 显示全部楼层
呵呵,咱们新学,慢慢搞的多了就好了,经验要慢慢积累的,互相帮助吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 23:05:39 | 显示全部楼层
topcookie 发表于 2011-9-28 22:47
呵呵,咱们新学,慢慢搞的多了就好了,经验要慢慢积累的,互相帮助吧

恩,慢慢来,多多相互帮助!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2014-1-8 21:39:37 | 显示全部楼层
互动滴不错 学习了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-17 18:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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