sinat_41342171 2019-06-16 21:16 采纳率: 0%
浏览 1011

汇编语言jnz指令调用时出现jump out of range问题,怎么解决?

汇编程序调用jnz指令时出现了jump out of range 的问题,改之前是这样

jnz bj1
jnz loop1

百度了解决方法之后我在代码中间加上了

  bj10:jmp bj1
  loop10:jmp loop1

但是程序运行结果出现了乱码,怎么改呢?求大佬指点!

源代码如下,是对学生成绩进行排序显示是从网上下载下来学习的,侵删

DATAS SEGMENT
    mess0 db 0ah,0dh,'num     name     score    xuehao$' ;
    mess1 db 0ah,0dh,'input name :$'
    mess2 db 0ah,0dh,'input score:$'
    mess3 db 0ah,0dh,'input xuehao:$'
    mess4 db 'xueshengchengjipaixu$'
    p equ 3;输入的人数
    buff1 db 10,?,10 dup(0);姓名缓冲区,加$符号以便输出时使用
    buff2 db 3,?,3 dup(0);成绩缓冲区
    buff3 db 4,?,4 dup(?)
    sname db p dup(10 dup(0));保存姓名
    score db p dup(3 dup(0));保存成绩
    xuehao db p dup(4 dup(0))
    sing1 dw 0
    sing2 dw 0
    sing3 dw 0
    count db '1';计数

    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
  hong1 macro  ;定义回车换行的宏
    mov dl,0ah
    mov ah,2
    int 21h
    mov dl,0dh
    mov ah,2
    int 21h
    endm
  hong2 macro opr1,opr2  ;定义输入输出
    lea dx,opr1
    mov ah,opr2
    int 21h
    endm
  hong3 macro  ;定义空格
    mov dl,20h
    mov ah,2
    int 21h
    endm
  hong4 macro opr1,opr2  ;清楚缓存区里的回车键
    mov al,opr1
    add al,2
    mov ah,0
    mov si,ax
    mov opr2,0
    endm
  hong5 macro opr1,opr2,opr3,opr4  ;传送姓名
    mov cx,opr1
    lea si,opr2
    lea di,opr3
    add di,opr4
    cld
    rep movsb
    mov cx,opr1
    mov ax,0
    lea di,opr3
    endm  

START:
     MOV AX,DATAS
     MOV DS,AX  
    mov es,ax
    mov bx,0;
    mov cx,0
    hong2 mess4,9
    hong1
    call input;调用子程序1
    call bijiao
    call print 
    mov ah,4ch
    int 21h   ;子程序1,输入姓名、成绩,学号
input proc 
    inc bx;输入次数统计
    cmp bx,p;输入次数>p?
    ja exit
    hong2 mess1,9  ;宏调用提示和输入姓名
    lea dx,buff1;显示提示1
    mov ah,10
    int 21h
    mov al,buff1+1;实际输入个数放入AL
    add al,2;+2,包含buff1的0,1单元号
    mov ah,0
    mov si,ax;回车0d所在位置,跟在最后一个字符后
    mov buff1[si],0;将0d换为0,便于输出显示
    hong2 mess2,9     ;宏调用提示和输入分数
    hong2 buff2,10
    hong4 buff2+1,buff2[si]  ;宏调用清空回车键
    hong2 mess3,9       ;宏调用提示和输入学号
    hong2 buff3,10
    hong4 buff3+1,buff3[si]  ;宏调用清空回车键
    cmp bx,1
    jz let5
    add sing1,10
    add sing2,3
    add sing3,4
  let5:call zhuancun
    jmp input
    exit:
      ret
    input endp

    ;转存子程序
  zhuancun proc
    mov cx,10
    lea si,buff1+2   ;传送姓名
    lea di,sname
    add di,sing1
    cld
    rep movsb
    mov cx,10    ;将缓存区清空
    mov ax,0
    lea di,buff1+2
    rep stosb
    hong5 3,buff2+2,score,sing2
    hong5 4,buff3+2,xuehao,sing3
    ret
  zhuancun endp

  ;比较子程序
  bijiao proc
    mov cx,p
  loop1:push cx  ;保存外循环
    mov di,0
    mov si,0
    mov bx,0
    mov cx,p-1
  bj1:mov al,score[bx]   ;比较十位
    cmp al,score[bx+3]
    jle bj2
    add bx,3
    add si,10
    add di,4
    dec cx
    jnz bj1
    jmp out1
  bj2:jl bj3    ;比较个位
    mov al,score[bx+1]
    cmp al,score[bx+4]
    jl bj3
    add bx,3
    add si,10
    add di,4
    dec cx
    jnz bj1
    jmp out1
  bj3:mov al,score[bx]   ;进行交换两个数字的位置
    xchg al,score[bx+3]
    mov score[bx],al
    mov al,score[bx+1]
    xchg al,score[bx+4]
    mov score[bx+1],al
    push si
    push cx
    mov cx,10

  bj10:jmp bj1
  loop10:jmp loop1

  lp1:     
    mov al,sname[si]
    xchg al,sname[si+10]
    mov sname[si],al
    inc si
    dec cx
    jnz lp1
    push di
    mov cx,4
  lp2:
    mov al,xuehao[di]
    xchg al,xuehao[di+4]
    mov xuehao[di],al
    inc di
    loop lp2
    pop di
    pop cx
    pop si
    add si,10
    add di,4
    add bx,3
    dec cx
    jnz bj10
  out1:pop cx
    dec cx
    jnz loop10
    ret
  bijiao endp
        ;输出子程序 
print proc
    hong1
    hong2 mess0,9
    mov cx,p
    mov bx,0
    mov si,0
    mov di,0
  rept1:       ;输出名次
    push cx
    hong1
    mov dl,count
    mov ah,2
    int 21h
    inc count
    mov cx,7
   l1:       
    hong3
    loop l1
    mov cx,10
   let1:    ;输出姓名
    mov dl,sname[bx]
    mov ah,2
    int 21h
    inc bx
    loop let1
    hong3
    mov cx,3
   let2:   ;输出分数
    mov dl,score[si]
    mov ah,2
    int 21h
    inc si
    loop let2
    mov cx,5
   l2:    
    hong3
    loop l2
    mov cx,4
   let3:      ;输出名次
    mov dl,xuehao[di]
    mov ah,2
    int 21h
    inc di
    loop let3
    hong1
    pop cx
    loop rept1
    ret
print endp    

CODES ENDS
    END START

  • 写回答

1条回答

  • 诺亚方舟23 2021-10-13 08:29
    关注

    您好解决了吗

    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站