汇编语言菜单系统
{修正行值}
else if (ah==下光标键)
{修正行值}
}
}
while (al!=Esc)
6.实验步骤
运行“光标漫游示例.EXE”了解需求。
①编一小程序获得特殊键“→、←、↑、↓”“Esc、回车”等的扫描码和Asc码值,并记录以备后用;
②写出光标漫游的算法(保存,用类自然语言描述,用word,与同学、老师讨论算法的可行性与正确性);
…..
IsESCKeyproc
…..
实训二色彩处理及方框显示
⒈问题
在显示屏显示各种形状的方框(大小不一)。
┬──┬ ┌───┐
│ │ │ │
└──┘ └───┘等
实验中可用1,2,3,4,…,9,0等来代替,如:
3
6
6
6
9
⒉实验基础
1注意颜色查看conio.c中的函数:
颜色名称
值
颜色名称
值
BLACK
;返回AH=扫描码,AL=字符码
2定位光标:用int 10h的2号
3清屏:用int 10h的6号(或7号)功能调用
MOV AH,6
MOV BH,04h
MOVAL,0
MOV CX,0
MOV DX,184fh
INT 10h
④相关键的扫描码和字符码
EnterKey EQU 1c0dh
EscKey EQU 010bh
UpCursor EQU 4800h
LeftCursor EQU 4b00h
RightCursor EQU 4d00h
DownCursor EQU 5000h
5.算法
do
{
定位光标
读键
if (al==特殊键)
{
if (ah==左光标键)
修正列值}
else if (ah==右光标键)
{修正列值}
else if (ah==上光标键)
dw EscKey,IsESCKey
dw UpCursor,IsUpCursor
dw LeftCursor,IsLeftCursor
dw RightCursor,IsRightCursor
dw DownCursor,IsDownCursor
上述跳转表共6项,每项为:键值(扫描码+字符码)、处理的入口地址
mov bh,0
mov al,boxstr
int 10h
mov cx,10
mov al,boxstr+1
showrepchar:
int 10h
loop showrepchar
mov al,boxstr+2
int 10h
注意上述代码和算法的关系。
6.直接写屏来显示的原理和方法
2.掌握跳转表的总控程序(入口地址为标号)
……
ContinueReadKey:
……
MOV BX,offset MenuJmpTbl
MOV CX,6
YesNoKeyEqual:
cmp ax,[bx]
je IsKeyEqual
add bx,4
loop YesNoKeyEqual
jmp ContinueReadKey
⑥使用体会和总结
实训一光标漫游改进
根据跳跃表法(另称跳转表,教材p180)来改进光标漫游程序。键:“→、←、↑、↓”、“Esc”、“Enter”、“ALT_X”(退出循环)。其中对“Esc”、“Enter”键暂不做任何处理。
1.掌握跳转表的原理
MenuJmpTbl dw Enterkey,IsEnterKey
实训一光标漫游
⒈问题
在25行80列的显示屏内,通过按键“→、←、↑、↓”来改变光标的位置,如按“→”键则光标往右侧走一列,按“↑”键则光标往上走一行的位置,最终通过“Esc”结束程序。
⒉边界问题
要处理好特殊情况:①光标在第一行,再按“↑”键时;②光标在第一列,再按“←”键时;③光标在第25行,再按“↓”键时;④光标在第80列,再按“→”键时。
③在②初步正确的基础上,编写汇编语言源程序;
④如发现算法问题,用调试器调试;
7.要点
光标如何根据所按的键跟随?折返如何处理?x=(x+1) %25;
8.该实验与大实验的关联性
请大家体会主菜单“实验蓝本.exe”的处理过程。
附件:实验报告内容
①问题
②设计要点及算法
③源程序
④运行结果
⑤使用调试器状况和经验总结
⒊边界问题处理
采用折返的方式:①光标在第1行,再按“↑”键时进到第25行;②光标在第1列,再按“←”键时进到第80行;③光标在第25行,再按“↓”键时进到第1行;④光标在第80列,再按“→”键时时进到第1列。
⒋实验基础
1读键:用int 16h的0号功能调用
掌握扫描码和字符码的区别
Mov ah,0
Int 16h
{//定位光标
//设置颜色并显示第一字符
//for显示中间字符
//显示最后一字符
}
5.实验关键
先实现ShowALineOfBox子程序,编程时考虑模块化的概念,处理参数的传递方法(先采用变量或寄存器的方式来传送)。参考下列案例:
boxstr db '123'
….
mov ah,0eh
mov bl,0fh
IsKeyEqual:
mov bx,[bx+2]
jmp bx
……
IsEnterKey:
…..
IsESCKey:
…..
3.掌握跳转表的总控程序(入口地址为子程序)
……
ContinueReadKey:
……
MOV BX,offset MenuJmpTbl
MOV CX,6
YesNoKeyEqual:
cmp ax,[bx]
②写出显示方框的算法(注意模块化);
③在②初步正确的基础上,编写汇编语言源程序;
④如发现算法问题,用调试器调试;
4完成本实验的实验报告。
4.算法
ShowBox(左上角坐标,右下角坐标,方框串,颜色)
{//显示第一行
//for显示中间行
//显示最后一行
}
ShowALineOfBox(左上角坐标,宽度,方框子串,颜色)
je IsKeyEqual
add bx,4
loop YesNoKeyEqual
jmp ContinueReadKey
IsKeyEqual:
mov bx,[bx+2]
callbx
jmpContinueReadKey
……
IsEnterKeyproc
……;不能用无条件转移指令等跳出子程序
ret
IsEnterKeyendp
0
DARKGRAY
8
BLUE
1
LIGHTBLUE
9
GREEN
2
LIGHTGREEN
10
CYAN
3
LIGHTCYAN
11
RED
4
LIGHTRED
12
MAGENTA
5
LIGHTMAGENTA
13
BROWN
6YELLOW14来自LIGHTGRAY7
WHITE
15
⒊实验步骤
①编写小程序,用int 10h的0eh功能来显示字符串;