微机原理实训——汇编设计菜单(一)

菜单代码的解释

本篇对给的代码做个解释,注释一下菜单界面实现的原理
实训内容是设计一个菜单
实现菜单的四个功能
分别是
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

执行结果是这样的,上下方向键选择菜单,敲击回车进入相应的子程序实现功能
在这里插入图片描述
本篇对给的代码做个解释,注释一下菜单界面实现的原理
不得不说老师的代码很巧妙,自己做很难想出来这样设计
下一篇我们对菜单进行修改,变成实训要求的四个功能的菜单

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值