菜单代码的解释
本篇对给的代码做个解释,注释一下菜单界面实现的原理
实训内容是设计一个菜单
实现菜单的四个功能
分别是
1.成绩录入
2.成绩修改
3.成绩排序
4.成绩查询
下面是老师给的附录,一个设计好的菜单界面
我对它做了相应的注释
// 老师已经给的代码
stack segment para stack 'stack'
db 256 dup(0)
stack ends
disp macro x,length,color
mov ax,1301h;ah=13h显示字符串 al显示方式=01表示显示后光标位置改变
mov bx,color;bh表示页码 bl表示属性颜色 bh=0 bx=0000 1111
mov cx,length;cx显示字符串长度 $-l7
mov dh,yy ;dh是行,dl是列
mov dl,x
mov bp,addr;bp要显示字符串的地址
int 10h;int10h中断
endm
;数据段定义了菜单的名字
data segment
l0 db ' MENU '
l1 db '====================='
l2 db '| EXAMPLE_1 '
l3 db '| EXAMPLE_2 '
l4 db '| EXAMPLE_3 '
l5 db '| RETURN '
l6 db '====================='
LL EQU $-l6
;$-l6就像here-l6一样,即当前位置(在字符串的末尾)和字符串的开头之间的距离(以字节为单位)
XX equ (80-ll)/2;分辨率80,一行宽80 减去ll(字符串的长度),除以2,实现一行居中显示
yy db ?
nn dw 1
;这里的tab对应可选取的菜单的行
tab dw ?,l2,l3,l4,l5
addr dw ?
data ends
code segment
assume cs:code,ds:data,es:data
beg: mov ax,data
mov ds,ax
mov es,ax
mov ax,3;ah=0,al=3,设置显示器模式 分辨率80*25 16色文本,可以快速清屏,很好用
int 10h
mov yy,8;第8行,从dosbox的屏幕的第8行开始显示
mov addr,offset l0 ;取偏移l0
last2: disp xx,ll,0fh
add addr,ll
inc yy;yy+1
cmp yy,15;7行菜单 8+7=15,<15就一直循环disp显示每一行的菜单
jl last2
mov nn,1;nn就是色带的位置
call compute;设置色带的子程序
disp xx+3,ll-6,51h;对应的行高亮
;读取键盘状态
scan: mov ah,1
int 16h
jz scan
mov ah,0;从键盘读入字符
int 16h ;键盘中断
cmp ah,80;方向键下 就是80
je down
cmp ah,72;方向键上 就是72
je up
cmp al,0dh;回车键 就是0dh
je exit;这里敲回车直接跳到结束
jmp scan;不是上面的按键就循环读取键盘
down: cmp nn,4;可操作的菜单有4行,所以是4的时候最后一行了不能再往下去了 不可以往下继续,直接跳回去
je scan
call compute
disp xx+3,ll-6,0fh;实现之前选中的行高亮取消,变成正常颜色
inc nn;nn加1
call compute
disp xx+3,ll-6,51h;当前选中的行高亮
jmp scan
up: cmp nn,1;第一行不能再往上去了,直接跳回
je scan
call compute
disp xx+3,ll-6,0fh
dec nn
call compute
disp xx+3,ll-6,51h
jmp scan
exit: mov al,byte ptr nn;敲击回车调到这里,nn的值给al,对al进行判断即可知道选中的第几行菜单,从而跳到对应的子程序
mov ah,4ch
int 21h
compute proc near;这个子程序主要功能就是 给addr(要显示字符串的地址)赋值,还有yy(要显示字符串的行)赋值
mov di,nn ;di=1
add di,di ;di=di+di
mov ax,tab[di]
;tab dw ?,l2,l3,l4,l5,l6
; 01,23,45,67,89,1011
;'| score-recording '
;上面的字符串中'|'距离score差3所以加3
add ax,3;ax=ax+3
mov addr,ax;addr是要显示的字符串地址
mov al,byte ptr nn
add al,9
;al+9的意思就是
;假如nn是1,应该是l2那一行高亮, 对应的就是屏幕第10行,第8行是l0,第9行是l1,第十行l2
mov yy,al;al的值给yy
ret
compute endp
code ends
end beg
执行结果是这样的,上下方向键选择菜单,敲击回车进入相应的子程序实现功能
本篇对给的代码做个解释,注释一下菜单界面实现的原理
不得不说老师的代码很巧妙,自己做很难想出来这样设计
下一篇我们对菜单进行修改,变成实训要求的四个功能的菜单