. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验七divide overflow问题,很奇怪,到了cx=6时才出现  [待解决] 回复[ 4次 ]   点击[ 384次 ]  
hex
[帖 主]   [ 发表时间:2011-10-25 16:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-20 18:19
代码是这样的
assume cs:codesg,ds:data

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'

        ;以上是表示21年的21个字符串

 

        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

        ;以上是表示21年公司总收的21个dword型数据

 

        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

        dw 11542,14430,45257,17800

        ;以上是表示21年公司雇员人数的21个word型数据

data ends

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

codesg segment
start:  mov ax,table
        mov es,ax                      ;table段地址送es
        mov ax,data
        mov ds,ax                      ;把data段送ds
        mov bx,0
        mov si,0
        mov di,0                         
        mov cx,15h                     ;设置循环数
        
    s:        mov ax,ds:[0]
        mov es:[bx],ax                ;把19送table中
        mov ax,ds:[si].2h
        mov es:[bx].2h,ax           ;把年份后两个ascii码送table中
        ;以上实现年份送table
        
        mov ax,ds:[di].08ah
        mov es:[bx].0ah,ax 
        ;以上实现雇员数送table中
        
        mov ax,ds:[si].54h
        mov dx,ds:[si].56h          
        mov es:[bx].5h,ax
        mov es:[bx].07h,ax           ;把收入放入dx.ax并送至table
        
        div word ptr es:[bx].0ah    ;就是这里,当循环到cx=6时就divide overflow。
        mov es:[bx].0dh,ax         ;做除法并把商放进table中
        
        add bx,10h
        add si,4h
        add di,2h
        loop s
        
        mov ax,4c00h
        int 21h
        
codesg ends

end start

一开始我是直接到loop那里p,结果就出现divide overflow,后来逐步调试,直到循环到cx=6时才出现divide overflow,编译的exe却没问题,很奇怪,希望各位能够指导一下。
hex
[第1楼]   [ 回复时间:2011-10-25 21:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-20 18:19
有没有热心的朋友解释一下,谢谢
hex
[第2楼]   [ 回复时间:2011-10-26 13:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-20 18:19
又有一个新问题:
assume cs:code,ds:data

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'
          ;以上是表示21年的21个字符串

          dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
          dd 345980,590827,853530,1183000,1843000,2759000,3753000,4649000,5937000
         ;以上是表示21年公司总收入的21个dword型数据

          dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
          dw 11542,14430,15257,17800
         ;以上是表示21年公司雇员人数的21个word型数据
data ends

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

start: mov ax,table
        mov es,ax        ;table段地址送es
        mov ax,data
        mov ds,ax        ;把data送ds
        mov bx,0
        mov si,0
        mov di,0         ;寄存器清零
        mov cx,21        ;设置循环数
 
    s:  mov ax,ds:[di].0a8h
        mov es:[bx].0ah,ax

        ;以上把雇员数送table中

        mov ax,ds:[0]       
        mov es:[bx],ax    ;把19送table
        mov dx,[si].2h
        mov es:[bx].2h,dx ;把年份后两个ascii码送table

       ;以上把所有年份送table

        mov ax,ds:[si].54h
        mov dx,ds:[si].56h                 ;把总收入的低字节放ax,高字节放dx
        mov es:[bx].5h,ax
        mov es:[bx].7h,dx         ;把收入送入table
        div word ptr es:[bx].0ah
        mov es:[bx].0dh,ax
        ;以上作除法后把结果送table   
   
        add di,2h 
        add bx,10h 
        add si,4h
        loop s
        
        mov ax,4c00h
        int 21h
        
code ends

end start

这个代码是正确的,可以编译,执行后夜不会有divide overflow,debug的时候也不会出问题。楼下有另外一段代码,那是有问题的。
hex
[第3楼]   [ 回复时间:2011-10-26 13:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-20 18:19
assume cs:codesg,ds:data

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'
         ;以上是表示21年的21个字符串

          dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
         dd 345980,590827,853530,1183000,1843000,2759000,3753000,4649000,5937000
         ;以上是表示21年公司总收入的21个dword型数据

          dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
         dw 11542,14430,15257,17800
         ;以上是表示21年公司雇员人数的21个word型数据
data ends

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

codesg segment

start:  mov ax,table
        mov es,ax                      ;table段地址送es
        mov ax,data
        mov ds,ax                      ;把data段送ds
        mov bx,0
        mov si,0
        mov di,0                         
        mov cx,21                     ;设置循环数
        
    s:        mov ax,ds:[di].08ah
        mov es:[bx].0ah,ax 
        ;以上实现雇员数送table中

          mov ax,ds:[0]
         mov es:[bx],ax              ;把19送table中
          mov dx,[si].2h
         mov es:[bx].2h,dx           ;把年份后两个ascii码送table中
        ;以上实现年份送table
        
        mov ax,ds:[si].54h
        mov dx,ds:[si].56h          
        mov es:[bx].5h,ax
        mov es:[bx].7h,dx           ;把收入放入dx.ax并送至table
        
        div word ptr es:[bx].0ah  
        mov es:[bx].0dh,ax         ;做除法并把商放进table中
        
        add bx,10h
        add si,4h
        add di,2h
        loop s
        
        mov ax,4c00h
        int 21h
        
codesg ends

end start

这段是有问题的,在debug的时候用p会出现divide overflow,实际上这两段代码基本上区别是不大的,我就搞不明白了,到底是什么原因导致出现divide overflow这个情况?希望有人可以解释一下。
programmingring
[第4楼]   [ 回复时间:2012-02-09 17:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-02-08 18:30
s:        mov ax,ds:[di].08ah   // 这里是a8吧
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved