鱼C论坛

 找回密码
 立即注册
查看: 1991|回复: 2

实验7程序问题求助

[复制链接]
发表于 2013-3-2 22:21:07 | 显示全部楼层 |阅读模式
5鱼币
    关于小甲鱼老师的《零基础学习汇编语言程序设计》中的实验7,我的程序代码如下:
  1. assume cs:code,ds:data,es:table

  2. data segment

  3.         db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  4.         db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5.         db '1993','1994','1995'
  6.         ;以上表示21年的21个字符串
  7.        
  8.         dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  9.         dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  10.         ;以上是表示21年公司总司总收入的21个dword型数据
  11.        
  12.         dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  13.         dw 11542,14430,15257,17800
  14.         ;以上是表示21年公司雇员人数的21个word型数据
  15.        
  16. data ends

  17. table segment
  18.         db 21 dup ('year summ ne ?? ')
  19. table ends

  20. code segment

  21. start:        mov ax,data
  22.                 mov ds,ax
  23.                 mov ax,table
  24.                 mov es,ax
  25.                
  26.                 mov bx,0
  27.                 mov si,0
  28.                
  29.                 mov cx,21
  30.                
  31. l:                mov ax,[bx]
  32.                 mov es:[si],ax
  33.                 mov ax,2[bx]
  34.                 mov es:2[si],ax
  35.                 ;以上将年份存储到table段中
  36.                
  37.                 mov ax,84[bx]
  38.                 mov es:5[si],ax
  39.                 mov ax,86[bx]
  40.                 mov es:7[si],ax
  41.                 ;以上将总收入放到table段中
  42.                
  43.                 mov ax,168[bx]
  44.                 mov es:10[si],ax
  45.                 ;以上将人数放到table段中
  46.                
  47.                 mov ax,es:5[si]
  48.                 mov dx,es:7[si]
  49.                
  50.                 div word ptr es:10[si]
  51.                 mov es:13[si],ax
  52.                 ;以上计算人均收入
  53.                
  54.                 add bx,4
  55.                 add si,16
  56.                
  57.                 loop l
  58.                
  59.                 mov ax,4c00h
  60.                 int 21h
  61.                
  62. code ends

  63. end start
  64.        
复制代码
    程序编译链接都没有问题,debug时按t命令逐条运行后第一次循环完成在loop指令处用p命令时会出现“Divide overflow”的溢出报错,用d命令查看table段中的内容发现程序只运行到1986年处后面的并没有运行。究竟是什么问题一直没有找出,请各位朋友给予帮助。谢谢大家!
特此指出我是在win7中的xp mode下调试的。

最佳答案

查看完整内容

主要是 48,49两行存在逻辑问题,人数是字型数据占2个字节,但是在你的循环里每次bx+4,所以没有把全部人数放到目标地址 你的大思路是正确的,下面我给一个我自己写的程序,总体的和你的差不多 区别就是把人数一部分独立出来,先传送到目标地址
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-2 22:21:08 | 显示全部楼层
本帖最后由 L]V[G 于 2013-3-3 00:06 编辑

主要是 48,49两行存在逻辑问题,人数是字型数据占2个字节,但是在你的循环里每次bx+4,所以没有把全部人数放到目标地址
你的大思路是正确的,下面我给一个我自己写的程序,总体的和你的差不多
区别就是把人数一部分独立出来,先传送到目标地址

  1. assume cs:code,ds:data,es:table ;2013年2月6日 12:47:27
  2.                                 ;目的:汇编实验7
  3. data segment
  4.     db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  5.     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  6.     db '1993','1994','1995'
  7.     ;年份,共占84个字节,在内存空间:data:0--data:83
  8.                                            ;data:0--data:53h
  9.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  10.     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  11.     ;收入,共占84个字节,在内存空间:data:84--data:167
  12.                                           ;data:54h--data:a7h
  13.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  14.     dw 11452,14430,15257,17800
  15.         ;人数,共占42个字节,在内存空间:data:168--data:209
  16.                                           ;data:a8h--data:d1h
  17. data ends

  18. table segment
  19.     db 21 dup ('year summ ne ?? ')
  20. table ends

  21. code segment
  22. start:
  23.       mov ax,data
  24.           mov ds,ax
  25.           
  26.           mov ax,table
  27.           mov es,ax
  28.           
  29.           mov si,0
  30.           mov di,0
  31.           mov cx,21
  32.    s0:mov ax,[bx].168[si] ;s0循环把每个人数放进目标地址
  33.       mov es:0ah[di],ax
  34.           add si,2
  35.           add di,16
  36.           loop s0
  37.    
  38.       mov si,0
  39.           mov di,0
  40.           mov cx,21
  41.    s1:mov ax,[bx].0[si] ;把每个年份放到目标地址
  42.       mov es:0[di],ax
  43.       mov ax,[bx].2[si]
  44.           mov es:2[di],ax
  45.           
  46.           mov ax,[bx].84[si] ;把每个收入放到目标地址
  47.       mov es:5[di],ax
  48.           mov ax,[bx].86[si]
  49.           mov es:7[di],ax
  50.           
  51.           mov ax,es:5[di]  ;把每个平均收入计算出来,放到目标地址
  52.       mov dx,es:7[di]
  53.           div word ptr es:0ah[di]
  54.           mov es:0dh[di],ax
  55.           
  56.           add si,4
  57.           add di,16
  58.           loop s1
  59.           
  60.           mov ax,4c00h
  61.           int 21h
  62. code ends

  63. end start
  64.           
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-3 11:24:40 | 显示全部楼层

就是这个问题 当时想错了 谢谢您!:handshake
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-7 01:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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