功能简介
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
效果
初始
下
按下按回车
具体请自行测试