鱼C论坛

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

【实验7】为什么用debug测试的时候才T到第二条就停止工作的呢?

[复制链接]
发表于 2012-4-17 14:54:55 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Beng! 于 2012-4-17 18:07 编辑

assume cs:code
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 34980,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
dw 4 dup (0)
stack ends

code segment
start:mov ax,stack
      mov ss,ax 《------运行这一条的时候就挂了!!!
      mov sp,5

      mov ax,data
      mov ds,ax

      mov ax,table
      mov es,ax
      mov si,0
      mov bx,0
      mov cx,21
S:    push cx
      mov di,0
      mov cx,4
   s1:mov al,ds:[si]
      mov es:[bx+di],al
      inc si
      inc di
   loop s1
      mov cx,4
      mov di,0
      mov si,0
   s2:mov al,ds:[si+42]
      mov es:[bx+di+5],al
      inc si
      inc di
   loop s2
      mov cx,2                                   
      mov si,0
      mov di,0
   s3:mov al,ds:[si+84]
      mov es:[bx+si+10],al
      inc si
      inc di
   loop s3
   add bx,16
   pop cx
loop s


      mov cx,21
      mov bx,0
      mov di,5
   s4:push es:[bx+di]
      pop dx
      push es:[bx+di]
      pop ax

      div word ptr es:[bx+10]
      mov ax,es:[bx+13]
      add bx,16
   loop s4

     mov ax,4c00h
     int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-17 16:03:41 | 显示全部楼层
弱弱的问一下,这样写对不对呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-17 17:38:10 | 显示全部楼层
本帖最后由 Y.H 于 2012-4-17 17:39 编辑

你这个程序还有除法溢出错误!
你定义栈段的时候是:dw 4 dup (0) 意思四个“字”的内存单元,也就是8个字节,
那么应该是mov ss,ax     mov sp,8    改为8之后顺利执行过去,

关于你这个除法溢出,还得你自己研究研究除法指令div的执行原理!


不过,看的出来,你在数据类型方面不熟悉,,,,估计你理解了上面的那个错误之后,你的除法溢出错误也能顺利解决。。。。



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-17 17:40:12 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-4-17 17:45 编辑

code segment
start:mov ax,stack
      mov ss,ax 《------运行这一条的时候就挂了!!!
      mov sp,5  太小了 你用debug 调试的时候最少也要弄个10H的栈

   mov cx,21
      mov bx,0
      mov di,5
   s4:push es:[bx+di]
      pop dx
      push es:[bx+di]
      pop ax

这个完全没必要写在循坏外面在循环一次除法.. 只需要找对位置然后进行除法... 往后面翻一番 以前有些发过这个实验题目的!~适当的参考以下别人的代码 试着给代码加上注释(这是理解代码的方法理解对方的思路)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-17 17:44:06 | 显示全部楼层
好的 我再试试 谢谢你们 亲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-17 17:44:53 | 显示全部楼层
本帖最后由 Y.H 于 2012-4-17 17:59 编辑

嗯,附上我写的,写的比较简单,没有用到循环嵌套,希望能帮你理清头绪

assume cs:code   


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,4549000,5937000 
;21年来每一年的总收入 

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 
dw 11542,14430,15257,17800 
;21年来每一年的雇员 
data ends   



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



code segment  
 
start:
 
                mov  ax,data 
                mov  ds,ax  
 
                mov  ax,table 
                mov  es,ax  
 
                mov  ax,0 
                mov  bx,0 
                mov  si,0 
                mov  di,0
                
                
                ;先把年份送入table段的前2个字中 
                mov  cx,21 
year: 
                mov  ax,ds:[si] 
                mov  es:[bx+di],ax        
                add  si,2 
                add  di,2 
                mov  ax,ds:[si] 
                mov  es:[bx+di],ax 
                add  si,2 
                sub  di,di 
                add  bx,10h 
loop year
 
  
 
  
 
                mov  ax,0 
                mov  bx,0 
                mov  si,84 
                mov  di,0 
                ;把收入送入table段的5,6,7,8字节中 
                mov  cx,21 
summ: 
                mov  ax,ds:[si] 
                mov  es:[bx+di+5h],ax 
                add  si,2 
                add  di,2 
                mov  ax,ds:[si] 
                mov  es:[bx+di+5h],ax 
                add  si,2 
                mov  di,0 
                add  bx,10h 
loop summ 
  
 
  
 
                mov  ax,0 
                mov  bx,0 
                mov  si,168 
                ;把雇员人数送入table段的a,b字节中 
                mov  cx,21 
guyuan: 
                mov  ax,ds:[si] 
                mov  es:[bx+0ah],ax 
                add  si,2 
                add  bx,10h 
loop guyuan 
 
  
 
  
 
                mov  di,0 
                mov  si,0 
                mov  bx,0 
                ;算出人均工资,取商AX,放入table段的d,e字节中 
                mov  cx,21 
jieguo: 
                mov  ax,es:[bx+di+5h] 
                add  di,2 
                mov  dx,es:[bx+di+5h] 
                sub  di,di
                
 
                div  word ptr es:[bx+0ah] 
                mov  es:[bx+0dh],ax
 
                add  bx,10h
 
loop jieguo  
 
  
 
        mov  ax,4c00h 
                        int  21h
 
code ends
 
end start 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-17 17:59:22 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-17 18:00:28 | 显示全部楼层
莫名其妙 发表于 2012-4-17 17:40
code segment
start:mov ax,stack
      mov ss,ax 《------运行这一条的时候就挂了!!!

谢谢你的提示,回头我去找找看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-8 10:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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