. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验7. 我有点想砸电脑的冲动!  [已解决] 回复[ 5次 ]   点击[ 337次 ]  
ryan1779
[帖 主]   [ 发表时间:2009-07-26 17:09 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:5
注册日期:2009-05-25 11:39
程序是写了又改,改了又写,改改写写,写写改改。最后搞了个溢出出来。请大家看看到底要怎么改:

start:mov ax,data
      mov ds,ax
      mov ax,table
      mov es,ax
      mov bx,0
      mov di,0
      mov cx,21

   s0:mov bp,cx  _______________;把cx放入bp,因为等下要循环。
      mov si,0
      mov cx,2

    s:mov ax,[di]
      mov es:[bx][si],ax  
      mov ax,54h[di]
      mov es:5h[bx][si],ax
      add si,2
      add di,2
      loop s   _________________;以上7句是把年份和收入放入,循环2次刚好。


      mov ax,0a8h[bx]
      mov es:0ah[bx],ax  ________________;人数放入。

 
      mov dx,es:7h[bx]
      mov ax,es:5h[bx]
      div word ptr es:0ah[bx]
      mov es:0dh[bx],ax  ________________;把人均收入放入。
                                         ;以上3个放入就把一行数据放好了,接下来就是循环了。
      add bx,16
      mov cx,bp  ___________;把cx设为21,因为有21行,要循环21次。
      loop s0

      mov ax,4c00h
      int 21h

codesg ends

end start

结果:前面几次循环后是可以的,但是循环到后面,debug却提示数据溢出,我个人认为没什么错误啊。搞来搞去,实在搞不出了,只好来论坛请教大家了。。
tinyparticle
[第1楼]   [ 回复时间:2009-07-26 19:38 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
肯定是循环出问题了,我前几次做的时候也出现这种情况,后面修改好的。
用debug跟踪一下,看看从哪里开始出问题的,然后修改。
tinyparticle
[第2楼]   [ 回复时间:2009-07-26 19:46 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
看了一部分,还没看完,贴主没有把所有程序贴上,我手上正好没有书,根据记忆看了下,发现

      mov ax,0a8h[bx] 
      mov es:0ah[bx],ax  ________________;人数放入。 

  
这里好像[bx]指向有问题,后面有条指令add bx,16,循坏后数据段中的偏移地址更改,指向会出现错误
ryan1779
[第3楼]   [ 回复时间:2009-07-27 11:05 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:5
注册日期:2009-05-25 11:39
看了一部分,还没看完,贴主没有把所有程序贴上,我手上正好没有书,根据记忆看了下,发现 

      mov ax,0a8h[bx]  
      mov es:0ah[bx],ax  ________________;人数放入。  

   
这里好像[bx]指向有问题,后面有条指令add bx,16,循坏后数据段中的偏移地址更改,指向会出现错误
——————————————————————————————————————————————————————————————————————————————————————————————————————
不可能是[bx]出问题啊,add bx,16是为了循环后es:table换行所准备的,而且前面bx=0,我不知道指向怎么会出问题呢?
ryan1779
[第4楼]   [ 回复时间:2009-07-27 14:36 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:5
注册日期:2009-05-25 11:39
重新又分析了下:
      mov ax,0a8h[bx]  
      mov es:0ah[bx],ax  ________________;人数放入。  

第一个[bx]指向的确出了问题,现在想了几个解决方案
1、换个寄存器(不过好像能用的寄存器都用没了)
2、放入栈堆或内存地址

非常感谢  tinyparticle   的热心帮助
谢谢
ryan1779
[第5楼]   [ 回复时间:2009-07-28 10:06 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:5
注册日期:2009-05-25 11:39
此贴由 贴主 于 [ 2009-07-28 10:06 ] 结贴。 结贴原因:问题已解决
得分情况: 2楼(tinyparticle):8分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved