📄 menu.asm
字号:
;FILENAME: MENU.ASM
;内容:光条式程序菜单设计
DISP MACRO X, LENGTH, COLOR ;定位显示彩色字符串
MOV AX, 1301H
MOV BX, COLOR ;属性字-BK
MOV CX, LENGTH ;串长度→CX
MOV DH,YY ;行值→DH
MOV DL,X ;列值→DL
MOV BP, ADDR ;待显串偏移地址→BP
INT 10H
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 ;LL为边框长度
XX EQU (80- LL)/2 ;XX为待显串首字符列值
YY DB ? ;存放待显串的行值
NN DW 1 ;记录色带的位置
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
INT 10H ;清屏
MOV YY,8 ;菜单起始行值→YY单元
MOV ADDR, OFFSET L0 ;L0偏移地址→ADDR单元
LAST2: DISP XX, LL, 0FH ;显示一行菜单
ADD ADDR, LL ;下一串偏移地址→ADDR单元
INC YY ;下一菜单项行值→YY单元
CMP YY, 15
JL LAST2
MOV NN, 1
CALL COMPUTE
DISP XX+3,LL-6,51H ;令色带覆盖第1菜单项
SCAN: MOV AH, 1
INT 16H ;有键入?
JZ SCAN ;否,转等待输入
MOV AH, 0
INT 16H ;读键盘缓冲区
CMP AH, 80
JE DOWN ;是向下箭头键,转下移处理
CMP AH, 72
JE UP ;是向上箭头键,转上移处理
CMP AL, 0DH
JE EXIT ;是回车,转退出
JMP SCAN ;非法键,转等待输入
DOWN: CMP NN, 4
JE SCAN
CALL COMPUTE
DISP XX+3,LL-6,0FH ;令当前色带消失
INC NN ;(NN)+1→NN单元
CALL COMPUTE
DISP XX+3,LL-6,51H ;色带下移1项
JMP SCAN
UP: CMP NN,1
JE SCAN
CALL COMPUTE
DISP XX+3,LL-6,0FH ;令当前色带消失
DEC NN ;(NN)-1→NN单元
CALL COMPUTE
DISP XX+3,LL-6,51H ;色带上移1项
JMP SCAN
EXIT: MOV AL, BYTE PTR NN ;携带返回码
MOV AH, 4CH
INT 21H ;返回批处理
;------------------------------------------------------
COMPUTE PROC ;计算子程序
MOV DI, NN
ADD DI,DI
MOV AX,TAB[DI]
ADD AX,3
MOV ADDR,AX ;待显串偏移地址→ADDR单元
MOV AL, BYTE PTR NN
ADD AL,9
MOV YY,AL
RET
COMPUTE ENDP
CODE ENDS
END BEG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -