396449673 发表于 2019-8-18 20:21:11

运行到div程序就退出,而且是正常退出,求助

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

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

http://i2.tiimg.com/697342/d03ae8b0eb556d6b.png

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,
      mov word ptr es:,ax
      mov ax,2h
      mov word ptr es:2h,ax
      add di,5
      
      mov ax,54h
      mov word ptr es:,ax
      mov ax,56h
      mov word ptr es:2h,ax
      
      add di,2
      
      mov ax,
      mov word ptr es:,ax
      add di,2
      mov ax,54h
      mov dx,56
      div word ptr ds:
      mov es:,ax
      add si,4
      add bx,16
      
      loop s
      
      mov ax,4c00h
      int 21h
      codesg ends
      end start

396449673 发表于 2019-8-18 20:44:54

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

那个56少写了一个h,加上之后前3个循环对了,第四个循环就又正常退出了

jackz007 发表于 2019-8-18 20:47:45

本帖最后由 jackz007 于 2019-8-18 20:55 编辑

       通过楼主贴出的图片可以看到相关的存储器和存储单元:DX = 3931,AX = 0010,WORD PTR DS: = 0300
       就是说,执行的除法是
       39310010H div 300H = 131055H
       显然,这个商太大,已经远远超出了一个 16 位寄存器(AX)所能储存的数值范围,所以才会溢出。

jackz007 发表于 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:
      mov dx,word ptr es:
      div word ptr es:
      mov word ptr es:,ax
      add bx,16
      loop m4

      mov ax,4c00h
      int 21h
main endp
code ends
end main

396449673 发表于 2019-8-18 22:20:42

jackz007 发表于 2019-8-18 21:26
试试我修改的代码吧

{:5_100:}你的可以{:5_109:},movsw我还没学到{:5_108:}很6,了解一下思路,然后现在我去看看我的是不是写错位置了

396449673 发表于 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,
        mov word ptr es:,ax
        mov ax,2h
        mov word ptr es:2h,ax
        add di,5
       
        mov ax,54h
        mov word ptr es:,ax
        mov ax,56h
        mov word ptr es:2h,ax
       
        add di,2
       
        mov ax,
        mov word ptr es:,ax
        add di,2
        mov ax,54h
        mov dx,56h
        div word ptr ds:
        mov es:,ax
        add si,4
        add bx,16
       
        loop s
       
        mov ax,4c00h
        int 21h
        codesg ends
        end start

396449673 发表于 2019-8-18 23:26:52

问题没有完全解决,现在的数据还是不准确的,明早在排查

396449673 发表于 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,
        mov word ptr es:,ax
        mov ax,2h
        mov word ptr es:2h,ax
        add di,5
       
        mov ax,54h
        mov word ptr es:,ax
        mov ax,56h
        mov word ptr es:2h,ax
       
        add di,5
       
        mov dx,0
        mov ax,si
        mov ds:,ax
        mov ds:,2
        div word ptr ds:
       
        mov si,ax
        mov ax,
       
        mov word ptr es:,ax
        mov ax,ds:
        mov si,ax
        add di,3
        mov ax,54h
        mov dx,56h
        div word ptr es:
        mov es:,ax
        add si,4
        add bx,16
       
        loop s
       
        mov ax,4c00h
        int 21h
        codesg ends
        end start
页: [1]
查看完整版本: 运行到div程序就退出,而且是正常退出,求助