沉默=金 发表于 2012-7-5 10:01:28

求助:高手们帮忙看看错在哪里。。。

assume cs:codesg,ds:datasg,ss:stacksg,es:tablesg

datasg 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,187514
          dd 345980,590827,803530,1183000,2759000,3753000,4649000,5937000
          
          dw 3,7,9,13,28,130,220,476,778,1001,1442,2258,2793,4037,5635,2886
          dw 11542,14430,15257,17899          
datasg ends

tablesg segment
      db 21 dup('year sumn ne ?? ')
tablesg ends

stacksg segment stack
      db 0
stacksg ends

codesg segment
start:mov ax,tablesg
      mov es,ax
                mov ax,datasg
                mov ds,ax
                mov ax,stacksg
                mov ss,ax
                mov sp,10h
               
      mov bx,0               
                mov cx,21
        s0: push cx
       
          mov cx,4
                mov si,0
                mov di,0
        s1: mov al,ds:
          mov es:,al
          mov al,ds:
                mov es:,al
                inc si
                inc di
                loop s1
               
                mov cx,2
                mov si,0
                mov di,0
    s2: mov al,ds:
          mov es:,al
          inc si
                inc di
                loop s2
               
                mov ax,es:
                mov dx,es:
                div word ptr es:
                mov es:,ax
               
                pop cx
                add bx,10h
                loop s0
               
                mov ax,4c00h
                int 21h
               
codesg ends
end start
               
               
               
               
               

NeBen 发表于 2012-7-5 10:15:45

本帖最后由 NeBen 于 2012-7-5 11:02 编辑

这样把,我把正确的给你看下,我详细的写了注释,看下能帮到你吗?

NeBen 发表于 2012-7-5 10:16:42

本帖最后由 NeBen 于 2012-7-6 20:33 编辑

最好不要用多个循环,有点复杂,而且让人不好理解,我是单循环的。

沉默=金 发表于 2012-7-5 10:34:52

你好,谢谢,你的程序简单明了多了。。。我运行之后查看了,好像输出结果有一点小问题。。。不知道是什么情况。。。{:1_1:}

NeBen 发表于 2012-7-5 11:01:52

沉默=金 发表于 2012-7-5 10:34 static/image/common/back.gif
你好,谢谢,你的程序简单明了多了。。。我运行之后查看了,好像输出结果有一点小问题。。。不知道是什么情 ...

什么小问题呢,我自己机子测试完全没问题,结果和答案一致

沉默=金 发表于 2012-7-5 11:12:27

我不是很清楚,还是我搞错了,我的截图

沉默=金 发表于 2012-7-5 11:17:03

拜托老鸟帮俺看一下吧。。。为什么老是显示 Devide overflow:L:L:L


assume cs:codesg,ds:datasg,ss:stacksg,es:tablesg

datasg 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,187514
          dd 345980,590827,803530,1183000,2759000,3753000,4649000,5937000
           ;以上是表示21年公司总收的21个dword型数据
          
          dw 3,7,9,13,28,130,220,476,778,1001,1442,2258,2793,4037,5635,2886
          dw 11542,14430,15257,17899       
          ;以上是表示21年公司雇员人数的21个word型数据
                  
datasg ends

tablesg segment
      db 21 dup('year sumn ne ?? ')
tablesg ends

stacksg segment stack
      db 0
stacksg ends

codesg segment
start:mov ax,tablesg
      mov es,ax       ;es指向tablesg段
               
                mov ax,datasg
                mov ds,ax      ;将datasg段定义为数据段
               
                mov ax,stacksg
                mov ss,ax
                mov sp,10h   ;将stacksg段定义为栈段
               
      mov bx,0               
                mov cx,21      ;设置循环次数为21次,因为是21年的数据
        s0: push cx      ;将CS入栈保存循环次数
          
          ;复制年份和收入
          mov cx,4      ;设置循环次数为4次,因为是4个字节
                mov si,0
                mov di,0      ;将偏移地址清零
        s1: mov al,ds:    ;用bx来控制行,si来控制列,idata来控制特定的位置
          mov es:,al   ;用al不用ax,每次传送一个字节
          mov al,ds:   ;前八十四个字节是年份
                mov es:,al    ;第五行开始,第四行是空格
                inc si
                inc di
                loop s1
               
          ;复制人数       
                mov cx,2         ;设置循环次数为2次,因为是2个字节
                mov si,0
                mov di,0         ;将偏移地址清零
    s2: mov al,ds:
          mov es:,al
          inc si
                inc di
                loop s2
               
                ;计算人均收入
                mov ax,es:    ;将低位放入ax中
                mov dx,es:    ;将高位放入dx中
                div word ptr es:
                mov es:,ax
               
                pop cx         ;将CS出栈
                add bx,10h      ;推进一行
                loop s0
               
                mov ax,4c00h
                int 21h         ;中断程序正常退出
               
codesg ends
end start
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

NeBen 发表于 2012-7-5 11:55:58

你把简单的问题复杂化了,算了还是贴上代码,我自己的方法,也是多循环的,你看看把,能给你点帮助吗,真心看不懂你的代码,排版正常点。。。。:L

沉默=金 发表于 2012-7-5 15:49:13

没有,只是刚刚接触汇编,想把刚刚学的东西都用上,有劳你了。。。排版我是直接用的的复制粘贴。。。请谅解。。。呵呵。。。{:1_1:}

爱人等于爱自 发表于 2012-7-7 12:23:18

还没有学到 呵呵 飘过
页: [1]
查看完整版本: 求助:高手们帮忙看看错在哪里。。。