鱼C论坛

 找回密码
 立即注册
查看: 3874|回复: 3

[已解决]一个汇编实验作业,已经对这这段代码9小时了,实在不行了,大佬求助

[复制链接]
发表于 2020-4-23 21:28:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 396449673 于 2020-4-24 10:40 编辑

题目:求一个班50名学生成绩的平均值、最大值和最小值,并将结果显示出来。
代码压缩包:点击这里,不会上传附件,这是onedrive
  1. assume cs:code,ds:data,ss:stack
  2. data segment
  3.     sum dw 0
  4.     score db 10 dup(80,70,60,90,90)
  5.     avg db 0
  6.     max db 0
  7.     min db 0FFh
  8.     msg1 db 'The average is',0ah,0dh,'$’
  9.     msg2 db 'The maxnum is',0ah,0dh,'$’
  10.     msg3 db 'The minnum is',0ah,0dh,'$’
  11.    
  12. data ends

  13. stack segment
  14.     dw 10 dup (?)
  15. stack ends

  16. code segment   
  17. start:
  18.       mov ax,data
  19.       mov ds,ax
  20.       mov ax,0
  21.       mov di,ax
  22.       mov cx,50
  23.       mov bx,offset score

  24. comp: mov ah,0
  25.       mov al,[bx+di]
  26.       inc di
  27.       cmp al,min
  28.       jc minc
  29. iend: cmp al,max     
  30.       jnc maxc
  31. aend: add ax,sum
  32.       mov sum,ax
  33.       loop comp   
  34.       mov ax,sum
  35.       mov bx,50
  36.       div bx
  37.       mov avg,al
  38.       mov cx,3
  39.       mov bx,0
  40.       jmp show
  41.       
  42.       table dw offset msg1,offset msg2,offset msg3,offset avg,offset max,offset min
  43. show:
  44.       mov dx,table[bx]
  45.       mov ah,09h
  46.       int 21h
  47.           sub dx,dx
  48.       mov dx,table[bx+3]                   ;--------------------------------这里出错,前面是筛选最大最小和求平均值,没问题
  49.       mov ax,dx
  50.       mov si,ax
  51.       mov al,[si]                                 ;这里是显示数值,后面都是显示的命令 应该也没问题
  52.       mov ah,0
  53.       mov dl,10
  54.       div dl
  55.       mov dx,ax
  56.       add dl,30h
  57.       mov ah,02h
  58.       int 21h
  59.       mov dl,dh
  60.       add dl,30h
  61.       mov ah,02h
  62.       int 21h
  63.       inc bx
  64.       loop show
  65.       mov ax,4c00h
  66.       int 21h
  67. minc: mov min,al
  68.       jmp iend
  69. maxc: mov max,al
  70.       jmp aend
  71.       
  72.      
  73. code ends
  74. end start
复制代码


前面没问题,总是在mov dx,table[bx+3]这里,给出错误的偏移地址,一开始以为emu8086的问题,结果dosbox也不行

                               
登录/注册后可看大图

这两个都在数据段,但是给出的地址确天差地别

                               
登录/注册后可看大图

这里的数据应该是0034

                               
登录/注册后可看大图

debug调试的时候有输出,但是直接运行并没有

                               
登录/注册后可看大图

第二次循环直接乱码

                               
登录/注册后可看大图

因为第二次给出的地址也错了,应该是0054
是不是地址相差太多导致溢出,应该不会吧,毕竟第一次给出的地址是对的
最佳答案
2020-4-23 22:37:31
把代码zip压缩,然后发上来
还有,你现在的这个程序输出了什么?
你认为这个输出不正确,那么正确的输出是什么?
这两个输出要贴出来,对调试程序很有用
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 22:37:31 | 显示全部楼层    本楼为最佳答案   
把代码zip压缩,然后发上来
还有,你现在的这个程序输出了什么?
你认为这个输出不正确,那么正确的输出是什么?
这两个输出要贴出来,对调试程序很有用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 10:42:01 | 显示全部楼层
人造人 发表于 2020-4-23 22:37
把代码zip压缩,然后发上来
还有,你现在的这个程序输出了什么?
你认为这个输出不正确,那么正确的输出 ...

没找到上传附件的选项,所以贴了onedrive的地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 15:19:40 | 显示全部楼层
本帖最后由 396449673 于 2020-4-24 15:20 编辑

改好了,是代码太长导致溢出了,以下是改好的代码,利用栈做了一个中介

                               
登录/注册后可看大图

  1. assume cs:code,ds:data,ss:stack
  2. data segment   
  3.     score db 10 dup(80,70,60,90,90)
  4.         msg1 db 'The average is','
  5.     msg2 db 'The maxnum is','
  6.     msg3 db 'The minnum is','
  7.         msg4 db '.',0ah,0dh,'
  8.     sum dw 0
  9.     avg db 0
  10.     max db 0
  11.     min db 0FFh
  12. data ends
  13. stack segment
  14.         dw 10 dup(?)
  15. stack ends
  16. code segment   
  17. start:
  18.       mov ax,data
  19.       mov ds,ax
  20.       mov ax,0
  21.       mov di,ax
  22.       mov cx,50
  23.       mov bx,offset score

  24. comp: mov ah,0
  25.       mov al,[bx+di]
  26.       inc di
  27.       cmp al,min
  28.       jc jmp1
  29. iend: cmp al,max     
  30.       jnc jmp2
  31. aend: add ax,sum
  32.       mov sum,ax
  33.       loop comp   
  34.       mov ax,sum
  35.       mov bx,50
  36.       div bx
  37.       mov avg,al
  38.           mov al,min
  39.           push ax
  40.           mov ax,offset msg3
  41.           push ax
  42.           mov al,max
  43.           push ax
  44.           mov ax,offset msg2
  45.           push ax
  46.           mov al,avg
  47.           push ax
  48.           mov ax,offset msg1
  49.           push ax
  50.       mov cx,3
  51.       mov bx,0
  52.       jmp show
  53. jmp1: jmp far ptr minc
  54. jmp2: jmp far ptr maxc
  55.       

  56. show: pop dx
  57.       mov ah,09h
  58.       int 21h
  59.           pop ax
  60.       mov ah,0
  61.       mov dl,10
  62.       div dl
  63.       mov dx,ax
  64.       add dl,30h
  65.       mov ah,02h
  66.       int 21h
  67.       mov dl,dh
  68.       add dl,30h
  69.       mov ah,02h
  70.       int 21h
  71.           mov dx,offset msg4
  72.           mov ah,09h
  73.           int 21h

  74.       loop show
  75.       mov ax,4c00h
  76.       int 21h
  77. minc: mov min,al
  78.       jmp far ptr iend
  79. maxc: mov max,al
  80.       jmp far ptr aend

  81. code ends
  82. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 09:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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