注册 登录
编程论坛 汇编论坛

loop循环中ip的地址忽然变了 .. 请大神们帮忙看一下

w8a5n1g116 发布于 2012-01-18 22:54, 798 次点击
这个程序 不能运行结束  loop循环的中途 ip的地址忽然变了  然后程序就变成无限循环了   但是我不知道为什么loop循环中ip的地址忽然变了   因为开始的几次循环ip的地址都很正常   请哪位大神给我看看 为什么   

assume cs:codesg,ss:stack,es:table,ds:data

   data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,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,11542,14430,15257,17800
   data ends
  
   table segment
   
   
   db 21 dup ('year summ ne ?? ')

    table ends
   
    stack segment
    dw 8 dup (0)
    stack ends
   
    codesg segment
start: mov ax,data
       mov ds,ax
       mov ax,table
       mov es,ax
       mov ax,stack
       mov ss,ax
       mov sp,16
       mov bx,0
       mov si,0
       mov di,0
       mov cx,21
 s0:   push cx
         
       mov cx,2
  s:   mov ax,[bx+si]
       mov es:[di],ax
       add si,2
       add di,2

       loop s
      
       add di,1
       mov ax,[bx+84]
       mov es:[di],ax
       mov ax,[bx+86]
       mov es:[di+2],ax
       mov ax,[bx+84]
       mov dx,[bx+86]
       push ax
       push dx

       add di,5
       mov ax,[bx+168]
       mov es:[di],ax
       mov cx,[bx+168]
      
       add di,3
       pop dx
       pop ax
      
       div cx
       mov es:[di],ax
       add di,3
       add bx,4
       mov si,0
       pop cx

       loop s0
      
      
    mov ax,4c00h
    int 21h
   
    codesg ends

end start
5 回复
#2
zaixuexi2012-01-23 00:11
无限循环?检查cx
ip地址变了?哪句造成的debug单步就知道了
#3
lingji5212012-01-26 00:48
我发现我读代码比写代码还困难,不知道多久能赶上楼上
#4
汇编疯狂者2012-02-16 13:48
这不是王爽那本书的习题吗。。
#5
笨蛋侦探2012-03-01 12:02
我运行都没有死循环呀,只有当CX=Ah 时出现了divide overflow除法溢出

出现除法溢出是因为 div cx 时 ax>cx. 当被除数的低位比cx大时就会出现除法溢出,这个书后面会讲。
我能想到的解决办法只能是不用cx 做除数,然后做除法的时候把 cx 设得大一点(只要保证ax<cx即可 ,或者你就设cx=ax+1).  
我没有用书上的数据,下面的数据时随机搞的。   
下面是我的代码:

assume cs:code,ds:data
data segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
    dd 13328h,18293h,2252h,20515h,7737h,13587h,25830h,20794h,19979h,12959h,21116h,11788h,15894h,26936h,19390h,22363h,15911h,17226h,17402h,7054h,10777h
    dw 3553h,6269h,2464h,9716h,1314h,2387h,1213h,5420h,2399h,4726h,910h,4827h,3381h,1753h,553h,6275h,1345h,615h,2650h,4624h,2015h
data ends
table segment
    db 21 dup ('year summ ne ?? ')  ;刚好一一对应,16个字节
table ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax
    mov ax,208
    mov sp,ax        ;先设设sp。这个貌似随便。
    mov bx,0
    mov si,0
    mov di,0
    mov cx,21
p1:    mov ax,[si]        ;年
    mov es:[bx],ax
    mov ax,[si+2]
    mov es:[bx+2],ax
    mov byte ptr es:[bx+4],' '
   
    mov ax,[84+si]    ;收入       刚开始我21*4-1=83,以为是从0开始算就减 1,其实是我弄混了,说不清楚。84是收入的开头,83是年的结尾。
    mov es:[bx+5],ax
    mov ax,[86+si]
    mov es:7[bx],ax      
    mov byte ptr es:[bx+9],' '
   
    mov ax,[168+di]
    mov es:[bx+10],ax
    mov byte ptr es:[bx+12],' '
   
    push cx        ;因为下面要算除法(薪水),所以借一下cx
    mov ax,[84+si]
    mov dx,[86+si]
    mov cx,[168+di]
    div cx
    mov es:[bx+13],cx   
   
    add di,2    ;注意一下这里的增量
    add si,4
    add bx,10h
    pop cx
    loop p1
   
    mov ax,4c00h
    int 21h
code ends
end start  
#6
笨蛋侦探2012-03-01 22:38
回复 5楼 笨蛋侦探
给自己改错一下,除法溢出的原因是  ⑴除数为0,⑵商太大,寄存器不能表达。            我简单地理解成cx<被除数是不对的!   
1