鱼C论坛

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

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

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

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

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

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

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

stack segment
    dw 10 dup (?)
stack ends

code segment   
start:
      mov ax,data
      mov ds,ax
      mov ax,0
      mov di,ax
      mov cx,50
      mov bx,offset score
 
comp: mov ah,0
      mov al,[bx+di]
      inc di
      cmp al,min
      jc minc
iend: cmp al,max     
      jnc maxc
aend: add ax,sum
      mov sum,ax
      loop comp    
      mov ax,sum
      mov bx,50
      div bx
      mov avg,al
      mov cx,3
      mov bx,0
      jmp show
      
      table dw offset msg1,offset msg2,offset msg3,offset avg,offset max,offset min
show: 
      mov dx,table[bx]
      mov ah,09h
      int 21h
          sub dx,dx
      mov dx,table[bx+3]                   ;--------------------------------这里出错,前面是筛选最大最小和求平均值,没问题
      mov ax,dx
      mov si,ax
      mov al,[si]                                 ;这里是显示数值,后面都是显示的命令 应该也没问题
      mov ah,0
      mov dl,10
      div dl 
      mov dx,ax
      add dl,30h
      mov ah,02h
      int 21h
      mov dl,dh
      add dl,30h
      mov ah,02h
      int 21h
      inc bx
      loop show
      mov ax,4c00h
      int 21h
minc: mov min,al
      jmp iend
maxc: mov max,al
      jmp aend
      
     
code ends
end start

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

                               
登录/注册后可看大图

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

                               
登录/注册后可看大图

这里的数据应该是0034

                               
登录/注册后可看大图

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

                               
登录/注册后可看大图

第二次循环直接乱码

                               
登录/注册后可看大图

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

使用道具 举报

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

使用道具 举报

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

没找到上传附件的选项,所以贴了onedrive的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

                               
登录/注册后可看大图
assume cs:code,ds:data,ss:stack
data segment    
    score db 10 dup(80,70,60,90,90)
        msg1 db 'The average is','
    msg2 db 'The maxnum is','
    msg3 db 'The minnum is','
        msg4 db '.',0ah,0dh,'
    sum dw 0
    avg db 0
    max db 0
    min db 0FFh
data ends 
stack segment
        dw 10 dup(?)
stack ends
code segment   
start:
      mov ax,data
      mov ds,ax
      mov ax,0
      mov di,ax
      mov cx,50
      mov bx,offset score
 
comp: mov ah,0
      mov al,[bx+di]
      inc di
      cmp al,min
      jc jmp1 
iend: cmp al,max     
      jnc jmp2 
aend: add ax,sum
      mov sum,ax
      loop comp    
      mov ax,sum
      mov bx,50
      div bx
      mov avg,al
          mov al,min
          push ax
          mov ax,offset msg3
          push ax
          mov al,max
          push ax
          mov ax,offset msg2
          push ax
          mov al,avg
          push ax
          mov ax,offset msg1
          push ax
      mov cx,3
      mov bx,0
      jmp show
jmp1: jmp far ptr minc
jmp2: jmp far ptr maxc
      

show: pop dx
      mov ah,09h
      int 21h
          pop ax
      mov ah,0
      mov dl,10
      div dl 
      mov dx,ax
      add dl,30h
      mov ah,02h
      int 21h
      mov dl,dh
      add dl,30h
      mov ah,02h
      int 21h
          mov dx,offset msg4
          mov ah,09h
          int 21h

      loop show
      mov ax,4c00h
      int 21h
minc: mov min,al
      jmp far ptr iend
maxc: mov max,al
      jmp far ptr aend

code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-28 23:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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