Beng! 发表于 2012-4-17 14:54:55

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

本帖最后由 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:
      mov es:,al
      inc si
      inc di
   loop s1
      mov cx,4
      mov di,0
      mov si,0
   s2:mov al,ds:
      mov es:,al
      inc si
      inc di
   loop s2
      mov cx,2                                 
      mov si,0
      mov di,0
   s3:mov al,ds:
      mov es:,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:
      pop dx
      push es:
      pop ax

      div word ptr es:
      mov ax,es:
      add bx,16
   loop s4

   mov ax,4c00h
   int 21h
code ends
end start

Beng! 发表于 2012-4-17 16:03:41

弱弱的问一下,这样写对不对呀

Y.H 发表于 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的执行原理!


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



莫名其妙 发表于 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:
      pop dx
      push es:
      pop ax

这个完全没必要写在循坏外面在循环一次除法.. 只需要找对位置然后进行除法... 往后面翻一番 以前有些发过这个实验题目的!~适当的参考以下别人的代码 试着给代码加上注释(这是理解代码的方法理解对方的思路)

Beng! 发表于 2012-4-17 17:44:06

好的 我再试试 谢谢你们 亲

Y.H 发表于 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:

                movax,data
                movds,ax

                movax,table
                moves,ax

                movax,0
                movbx,0
                movsi,0
                movdi,0
               
               
                ;先把年份送入table段的前2个字中
                movcx,21
year:
                movax,ds:
                moves:,ax       
                addsi,2
                adddi,2
                movax,ds:
                moves:,ax
                addsi,2
                subdi,di
                addbx,10h
loop year





                movax,0
                movbx,0
                movsi,84
                movdi,0
                ;把收入送入table段的5,6,7,8字节中
                movcx,21
summ:
                movax,ds:
                moves:,ax
                addsi,2
                adddi,2
                movax,ds:
                moves:,ax
                addsi,2
                movdi,0
                addbx,10h
loop summ




                movax,0
                movbx,0
                movsi,168
                ;把雇员人数送入table段的a,b字节中
                movcx,21
guyuan:
                movax,ds:
                moves:,ax
                addsi,2
                addbx,10h
loop guyuan





                movdi,0
                movsi,0
                movbx,0
                ;算出人均工资,取商AX,放入table段的d,e字节中
                movcx,21
jieguo:
                movax,es:
                adddi,2
                movdx,es:
                subdi,di
               

                divword ptr es:
                moves:,ax

                addbx,10h

loop jieguo



      movax,4c00h
                        int21h

code ends

end start

Beng! 发表于 2012-4-17 17:59:22

Y.H 发表于 2012-4-17 17:44 static/image/common/back.gif
嗯,附上我写的,写的比较简单,没有用到循环嵌套,希望能帮你理清头绪

看到了~很有条理,谢谢,亲
我再研究研究

Beng! 发表于 2012-4-17 18:00:28

莫名其妙 发表于 2012-4-17 17:40 static/image/common/back.gif
code segment
start:mov ax,stack
      mov ss,ax 《------运行这一条的时候就挂了!!!


谢谢你的提示,回头我去找找看
页: [1]
查看完整版本: 【实验7】为什么用debug测试的时候才T到第二条就停止工作的呢?