自学过程中,打算在dos环境用汇编语言写一个简易菜单,用上下键选择选项,同时打入回车键响应相应功能,但是在这一步卡了,就是打入回车时第一行功能并不使用,只能进行选项的选择,功能不能实现
以下是.asm文件
;extrn jiamain:far
;include cluate.mac
openwindow macro
mov ah,6
mov al,0
mov bh,70h
mov ch,5
mov cl,10
mov dl,59
int 10h
endm
OPTION_TOP equ 11 ;顶部选项(行)
OPTION_BOTTOM equ 14 ;底部选项(行)
data segment
;主菜单界面
mainOption1 DB 'ADD', 0DH, 0AH, '$' ;7 B
mainOption2 DB 'SUB', 0DH, 0AH, '$'
mainOption3 DB 'MUL', 0DH, 0AH, '$'
mainOption4 DB 'DIV', 0DH, 0AH, '$'
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
mainMenu mainOption4, 7H, 7, 0E10H
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
call_jia:
openwindow
call jiamain
confirm:
cmp currentRow,OPTION_TOP
jz call_jia
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
运行截图: