dos下汇编语言实现简易主菜单

功能简介

40×25文本方式下显示几个选项,默认标识第一项,按上下方向键可滚动选择,按回车键退出程序。

程序源码

用到了符号常量和宏汇编,方便修改,注意区分标识符以及一些技巧,不便多说,直接上源码了

OPTION_TOP equ 11  ;顶部选项(行)
OPTION_BOTTOM equ 13 ;底部选项(行)
;
data segment
;主菜单界面
;
mainOption1 DB 'Option1'  ;7 B
mainOption2 DB 'Option2'
mainOption3 DB 'Option3'
;
currentRow DB OPTION_TOP ;初始化当前行
data ends
;
mainCode segment
assume cs:mainCode,ds:data
main: mov ax,01H ;设置文本显示方式01H
 int 10H
 mov ah,1   ;置光标类型
 mov cx,1000H  ;隐藏光标
 int 10H
 ;
 mov ax,data
 mov es,ax
 mov ax,1300H ;显示字符串,方式0
 ;
mainMenu macro head,pageColour,len,showpos
 ;
 mov bp,offset head ;显示标题
 mov bx,pageColour ;显示页和颜色
 mov cx,len  ;字符串长度
 mov dx,showpos ;显示行列位置
 int 10H
 endm
 ;
 ;显示选项1
 mainMenu mainOption1,7H,7,0B10H
 ;显示选项2
 mainMenu mainOption2,7H,7,0C10H
 ;显示选项3
 mainMenu mainOption3,7H,7,0D10H
 ;
 call indicateRow  ;切换行属性
 ;
userSelect: mov ah,0
 int 16H
 cmp ah,1CH  ;enter键
 je confirm
 cmp ah,48H  ;上方向键
 je moveUp
 cmp ah,50H  ;下方向键
 je moveDn
 jmp short userSelect
 ;
confirm: jmp return
;
moveUp: call moveUpward
 jmp short userSelect
moveDn: call moveDown
 jmp short userSelect
; 
return: mov ax,4C00H
 int 21H
 ;
;当前指示行,倒置切换行属性,切换两次即还原
indicateRow proc
 push ax
 push bx
 push cx
 push ds
 push es
 ;参数:currentRow
 mov ax,0B800H
 mov es,ax
 mov ax,data
 mov ds,ax
 mov al,currentRow
 mov bl,80
 mul bl
 mov bx,ax
; 
 mov ah,01111111B
 mov cx,40
indicate: xor es:[bx + 1],ah
 add bx,2
 loop indicate
 ;返回:无
 pop es
 pop ds
 pop cx
 pop bx
 pop ax
 ret
indicateRow endp
;
;向上选择
moveUpward proc
 call indicateRow  ;首先恢复原行
 push ax
 push ds
 ;参数:currentRow
 mov ax,data
 mov ds,ax
 cmp currentRow,OPTION_TOP
 je optionTop  ;是顶部选项则转移
 dec currentRow  ;上移则减行
 jmp short mUpNext
optionTop: mov currentRow,OPTION_BOTTOM ;由顶部转到底部
mUpNext: call indicateRow
; 
 pop ds
 pop ax
 ret
moveUpward endp
;
;向下选择
moveDown proc
 call indicateRow  ;首先恢复原行
 push ax
 push ds
 ;参数:currentRow
 mov ax,data
 mov ds,ax
 cmp currentRow,OPTION_BOTTOM
 je optionBot  ;是底部选项则转移
 inc currentRow  ;下移则增行
 jmp short mDnNext
optionBot: mov currentRow,OPTION_TOP ;由底部转到顶部
mDnNext: call indicateRow
; 
 pop ds
 pop ax
 ret
moveDown endp
;
mainCode ends
end main

效果

初始在这里插入图片描述

在这里插入图片描述
按下按回车
在这里插入图片描述
具体请自行测试

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值