396449673 发表于 2020-4-23 21:28:26

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

本帖最后由 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,
      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
      mov ah,09h
      int 21h
          sub dx,dx
      mov dx,table                   ;--------------------------------这里出错,前面是筛选最大最小和求平均值,没问题
      mov ax,dx
      mov si,ax
      mov al,                                 ;这里是显示数值,后面都是显示的命令 应该也没问题
      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这里,给出错误的偏移地址,一开始以为emu8086的问题,结果dosbox也不行
http://chuantu.xyz/t6/730/1587648467x1700468761.png
这两个都在数据段,但是给出的地址确天差地别http://chuantu.xyz/t6/730/1587695609x1822611243.png
这里的数据应该是0034
http://chuantu.xyz/t6/730/1587695713x2073530527.png
debug调试的时候有输出,但是直接运行并没有
http://chuantu.xyz/t6/730/1587695768x1700468761.png
第二次循环直接乱码
http://chuantu.xyz/t6/730/1587695804x2073530527.png
因为第二次给出的地址也错了,应该是0054
是不是地址相差太多导致溢出,应该不会吧,毕竟第一次给出的地址是对的

人造人 发表于 2020-4-23 22:37:31

把代码zip压缩,然后发上来
还有,你现在的这个程序输出了什么?
你认为这个输出不正确,那么正确的输出是什么?
这两个输出要贴出来,对调试程序很有用

396449673 发表于 2020-4-24 10:42:01

人造人 发表于 2020-4-23 22:37
把代码zip压缩,然后发上来
还有,你现在的这个程序输出了什么?
你认为这个输出不正确,那么正确的输出 ...

没找到上传附件的选项,所以贴了onedrive的地址{:5_100:}

396449673 发表于 2020-4-24 15:19:40

本帖最后由 396449673 于 2020-4-24 15:20 编辑

改好了,是代码太长导致溢出了,以下是改好的代码,利用栈做了一个中介
http://chuantu.xyz/t6/730/1587712748x2073530529.png
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,
      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
页: [1]
查看完整版本: 一个汇编实验作业,已经对这这段代码9小时了,实在不行了,大佬求助