汇编程序调用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