鱼C论坛

 找回密码
 立即注册
查看: 1760|回复: 7

[已解决]运行到div程序就退出,而且是正常退出,求助

[复制链接]
发表于 2019-8-18 20:21:11 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 396449673 于 2019-8-18 20:24 编辑

这是小甲鱼视频中间那个公司的工程,运行到div那一行程序就-----------正常地退出。。。。这是为什么


                               
登录/注册后可看大图


assume cs:codesg
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'
        
        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

table segment
        db 21 dup('year summ ne ?? ')
table ends

codesg segment

start:
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov bx,0
        mov si,0
        mov cx,21
        s:
        mov di,0
        mov ax,[si]
        mov word ptr es:[bx+di],ax
        mov ax,2h[si]
        mov word ptr es:2h[bx+di],ax
        add di,5
        
        mov ax,54h[si]
        mov word ptr es:[bx+di],ax
        mov ax,56h[si]
        mov word ptr es:2h[bx+di],ax
        
        add di,2
        
        mov ax,[bx+0A7h]
        mov word ptr es:[bx+di],ax
        add di,2
        mov ax,54h[bx]
        mov dx,56[bx]
        div word ptr ds:[bx+0A7h]
        mov es:[bx+di],ax
        add si,4
        add bx,16
        
        loop s
        
        mov ax,4c00h
        int 21h
        codesg ends
        end start
最佳答案
2019-8-18 21:26:11
本帖最后由 jackz007 于 2019-8-18 21:49 编辑

        试试我修改的代码吧
data segment para public 'DATA'
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
        db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
        db '1993','1994','1995'
        
        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

table segment
        db 21 dup('year summ ne ?? ')
table ends

stack segment stack
        dw 800h dup(00)
stack ends

code segment
        assume cs:code,ds:data,es:table
main proc far
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        xor bx,bx
        xor si,si
        mov cx,21
        cld
    m1: push cx
        mov di,bx
        mov cx,4
        rep movsb
        add bx,16
        pop cx
        loop m1
        mov bx,5
        mov cx,21
    m2: mov di,bx
        movsw
        movsw
        add bx,16
        loop m2
        mov bx,10
        mov cx,21
    m3: mov di,bx
        movsw
        add bx,16
        loop m3
        mov bx,5
        mov cx,21
    m4: mov ax,word ptr es:[bx]
        mov dx,word ptr es:[bx+2]
        div word ptr es:[bx+5]
        mov word ptr es:[bx+8],ax
        add bx,16
        loop m4

        mov ax,4c00h
        int 21h
main endp
code ends
end main
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-18 20:44:54 | 显示全部楼层
本帖最后由 396449673 于 2019-8-18 20:47 编辑

那个56少写了一个h,加上之后前3个循环对了,第四个循环就又正常退出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 20:47:45 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-18 20:55 编辑

       通过楼主贴出的图片可以看到相关的存储器和存储单元:DX = 3931,AX = 0010,WORD PTR DS:[00A7] = 0300
       就是说,执行的除法是
       39310010H div 300H = 131055H
       显然,这个商太大,已经远远超出了一个 16 位寄存器(AX)所能储存的数值范围,所以才会溢出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 21:26:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-8-18 21:49 编辑

        试试我修改的代码吧
data segment para public 'DATA'
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
        db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
        db '1993','1994','1995'
        
        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

table segment
        db 21 dup('year summ ne ?? ')
table ends

stack segment stack
        dw 800h dup(00)
stack ends

code segment
        assume cs:code,ds:data,es:table
main proc far
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        xor bx,bx
        xor si,si
        mov cx,21
        cld
    m1: push cx
        mov di,bx
        mov cx,4
        rep movsb
        add bx,16
        pop cx
        loop m1
        mov bx,5
        mov cx,21
    m2: mov di,bx
        movsw
        movsw
        add bx,16
        loop m2
        mov bx,10
        mov cx,21
    m3: mov di,bx
        movsw
        add bx,16
        loop m3
        mov bx,5
        mov cx,21
    m4: mov ax,word ptr es:[bx]
        mov dx,word ptr es:[bx+2]
        div word ptr es:[bx+5]
        mov word ptr es:[bx+8],ax
        add bx,16
        loop m4

        mov ax,4c00h
        int 21h
main endp
code ends
end main
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-8-18 22:20:42 | 显示全部楼层
jackz007 发表于 2019-8-18 21:26
试试我修改的代码吧

你的可以,movsw我还没学到很6,了解一下思路,然后现在我去看看我的是不是写错位置了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-18 22:53:01 | 显示全部楼层
已经找到问题,将si和bx用混了,还有将0A8H写成了0A7H

assume cs:codesg
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'
        
        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

table segment
        db 21 dup('year summ ne ?? ')
table ends

codesg segment

start:
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov bx,0
        mov si,0
        mov cx,21
        s:
        mov di,0
        mov ax,[si]
        mov word ptr es:[bx+di],ax
        mov ax,2h[si]
        mov word ptr es:2h[bx+di],ax
        add di,5
        
        mov ax,54h[si]
        mov word ptr es:[bx+di],ax
        mov ax,56h[si]
        mov word ptr es:2h[bx+di],ax
        
        add di,2
        
        mov ax,[bx+0A8h]
        mov word ptr es:[bx+di],ax
        add di,2
        mov ax,54h[si]
        mov dx,56h[si]
        div word ptr ds:[si+0A8h]
        mov es:[bx+di],ax
        add si,4
        add bx,16
        
        loop s
        
        mov ax,4c00h
        int 21h
        codesg ends
        end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-18 23:26:52 | 显示全部楼层
问题没有完全解决,现在的数据还是不准确的,明早在排查
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 09:03:01 | 显示全部楼层
这是昨晚修改的代码,已完全正确
assume cs:codesg
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'
        
        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

table segment
        db 21 dup('year summ ne ?? ')
table ends

codesg segment

start:
        mov ax,data
        mov ds,ax
        mov ax,table
        mov es,ax
        mov bx,0
        mov si,0
        mov cx,21
        s:
        mov di,0
        mov ax,[si]
        mov word ptr es:[bx+di],ax
        mov ax,2h[si]
        mov word ptr es:2h[bx+di],ax
        add di,5
        
        mov ax,54h[si]
        mov word ptr es:[bx+di],ax
        mov ax,56h[si]
        mov word ptr es:2h[bx+di],ax
        
        add di,5
        
        mov dx,0
        mov ax,si
        mov ds:[0FFFEh],ax
        mov ds:[0FFFCh],2
        div word ptr ds:[0FFFCh]
        
        mov si,ax
        mov ax,[si+0A8h]
        
        mov word ptr es:[bx+di],ax
        mov ax,ds:[0FFFEh]
        mov si,ax
        add di,3
        mov ax,54h[si]
        mov dx,56h[si]
        div word ptr es:[bx+0Ah]
        mov es:[bx+di],ax
        add si,4
        add bx,16
        
        loop s
        
        mov ax,4c00h
        int 21h
        codesg ends
        end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 23:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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