cmp al,'1'往哪里跳转???
Data segmentmes db'***menu***',0dh,0ah,'$'
mes1 db'***1-score valuation***',0dh,0ah,'$'
mes2 db'***2-Exit***',0dh,0ah,'$'
mes3 db'input number(1~2)',0dh,0ah,'$'
mes4 db'input a score',0dh,0ah,'$'
level1 db 0dh,0ah,'the level of score is:A','$' ;90-100分:成绩等级为 A
level2 db 0dh,0ah,'the level of score is:B','$' ;80-90分:成绩等级为 B
level3 db 0dh,0ah,'the level of score is:C','$' ;70-80分:成绩等级为 C
level4 db 0dh,0ah,'the level of score is:D','$' ;60-70分:成绩等级为 D
level5 db 0dh,0ah,'the level of score is:E','$' ;0-60分:成绩等级为 E
string db 0dh,0ah,'$'
table dw disp1,disp2 ;取得各个标号的偏移地址
Data ends
Code segment
assume cs:Code,ds:Data
start:mov ax,Data
mov ds,ax
start1:mov dx,offset mes ;显示简易数字菜单
mov ah,9
int 21h
mov dx,offset mes1
mov ah,9
int 21h
mov dx,offset mes2
mov ah,9
int 21h
mov dx,offset mes3 ;提示输入数字
mov ah,9
int 21h
mov ah,1 ;等待按键
int 21h
cmp al,'1' ;数字 < 1 ?
mov ah, 1
int 21h
cmp al,'o' ;若输入为字母o,则返回主菜单
je start1
cmp al, 0dh
je read3 ;输入为回车字符 则数据输入结束
cmp al, 30h ;不是0~9之间的字符,则输入结束
jl read3
cmp al, 39h
ja read3
sub al, 30h ; 是0~9之间的的字符,则转换为二进制数
mov ah, 0
xchg ax, bx ;交换ax和bx里的值
mov cx, 10
mul cx ;实现数字乘10
add bx, ax ; 已输入的数字乘10后,与新输入的数字值相加,结果放在bx中
jmp read2
read3:
jb start1
cmp al,'2' ;数字 >2 ?
ja start1
and ax,0000fh ;将ASCII码 转换成数字
dec ax
shl ax,1 ;等效于add ax,ax
mov bx,ax
jmp table[bx] ;(段内)间接转移:IP<-[table+bx]
start2:mov ah,4c
int 21h
start3:mov dx,offset level5
mov ah,9
int 21h
jmp disp1
start4:mov dx,offset level4
mov ah,9
int 21h
jmp disp1
start5:mov dx,offset level3
mov ah,9
int 21h
jmp disp1
start6:mov dx,offset level2
mov ah,9
int 21h
jmp disp1
start7:mov dx,offset level1
mov ah,9
int 21h
jmp disp1
read proc ;从键盘输入一个十进制数子程序
push cx
push ax
read1:
mov bx, 0 ;把bx清零
read2:
pop ax
pop cx
ret
read endp
disp1: mov dx,offset string ;成绩评定分支程序
mov ah,9
int 21h
mov dx,offset mes4 ;提示输入成绩
mov ah,9
int 21h
call read ;调用从键盘输入十进制数子程序
cmp bx,60 ;(bx)<60 ?
jb start3
cmp bx,70
jb start4
cmp bx,80
jb start5
cmp bx,90
jb start6
cmp bx,100 ;(bx)<=100 ?
jbe start7
disp2:jmp start2 ;返回DOS
Code ends
end start