汇编 菜单程序设计
汇编语言程序设计综合设计实验项目
汇编语言程序设计创新实验项目1. 编写一个完整的程序:根据零件的数量和总价格,计算出零件的单价。
主程序MAINPRO允许用户在键盘上输入零件数量和总价格;子程序SUBCONV 把从键盘输入的ASCII 码转化为二进制;子程序SUBCALC 计算出零件的单价;子程序SUBDISP 把二进制表示的单价转化为十进制数并显示出结果。
要求:在程序设计时要求使用顺序、分支、循环、子程序和宏汇编等多种方法解决程序设计问题,对于较大的子程序最好使用子程序嵌套,程序中如有多次重复的代码最好使用重复汇编。
2.编写一个完整的程序,分别输入有一个班学生的百分制成绩,根据学生百分制成绩转换出五级分数制。
如低于60分为E,60-69为D、70-79为C、80-89为B、90-99为A。
并统计该班学生人数。
要求:1、学生成绩从键盘接收;2、本程序可以重复运行,自行设计退出程序的方法;3、程序具有可操作性,如,应该有提示语句和判断非法操作的方法和处理方式。
3. 编写一个完整的程序,在屏幕上显示如图所示数字拼成的形状。
01234567891234567890234567890134567890124567890123567890123467890123457890123456890123456790123456784、按要求编写一个完整的程序。
要求:1、自BUFFER开始的内存单元中,存有一个ASCII码字符串。
查找已知字符串中含有多少个子字符串‘AB’的个数,将统计结果以十进制形式显示输出。
2、在查找到子字符串‘AB’后添加空格字符。
5、按要求编写一个完整的程序。
要求:1、编写子程序SORT,将内存中10个无符号字数据由小到大排序。
2、编写子程序FIND,在上述已排好的数据区里查找某一个数,若找到,显示其在数据区的位置,否则显示‘N’字符。
3、编写调用程序,完成排序及检索任务。
6、试编写一程序,要求根据用户键入的月份在终端上显示该月的英文缩写名。
汇编语言程序设计实验报告
汇编语言程序设计实验报告汇编语言程序设计实验报告引言:汇编语言是计算机中最基本的语言,通常用于处理硬件相关问题。
在这个实验中,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
以下是我们的实验报告。
正文:1. 实验环境我们使用的实验环境是Intel 8086微处理器与高级汇编语言。
微处理器使用的是PCB-512主板,而高级汇编语言是MASM。
2. 实验目的我们的实验目的主要是学习汇编语言的基础知识和编程技巧,包括了汇编语言的寄存器、指令、内存管理等方面的知识。
我们的另一个目的是掌握汇编语言的常用编程技巧,能够独立完成一些简单的汇编程序。
3. 实验内容我们的实验内容主要包括以下几点:(1)学习汇编语言的基础知识,包括寄存器、指令、内存管理等方面的知识。
(2)掌握汇编语言的常用编程技巧,包括数据输入输出、运算、跳转等基本操作。
(3)实践用汇编语言编写程序,如计算器、菜单等实用程序。
(4)了解8086微处理器的结构和原理。
4. 实验过程在这个实验过程中,我们完成了以下几个程序:(1)计算器计算器是一个简单的程序,主要用于实现两个数之间的加、减、乘、除等基本运算。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
(2)菜单菜单是一个实用程序,主要用于展示一个简单的菜单并实现用户选择相关功能的功能。
我们使用了汇编语言中的跳转指令、输入输出指令等实现了这个程序。
5. 实验结果在我们的实验中,我们成功完成了上述两个程序。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
6. 实验总结在这个实验过程中,我们学习汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
我们通过编写计算器和菜单等简单实用程序,加深了对汇编语言的理解和认识。
我们认为这个实验对我们今后的学习和工作都有很大的帮助。
结论:通过这个实验,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
汇编语言程序课程设计光带菜单主程序
主程序说明书include macrow.asm;-------------------------------------------------------------extra segmentmess0 db 80 dup(0c4h) ; 定义一条窗口宽度(80个字节)的横线(0c4h是横线的ASCII码)mess00 db 80 dup(20h) ; 定义一条窗口宽度(80个字节)的空格字符串(20h是空格的 ASCII码) messHL db 9 dup(0c4h) ; 定义长度为9个字符的横线messT db 8 dup(20h) ; 定义长度为9个字符的空格mess1 db 'Press "Enter" To Start' ; mess1,mess2为窗口下栏的提示信息mess2 db 'Press "Esc" To Exit'mess3 db 'Watch window ' ; messF,messE,messR,messC,messH为菜单栏所显示的内容messF db ' File 'messE db ' Edit 'messR db ' Run 'messC db ' Color 'messH db ' Help 'messF1 db '| New |' ; messF1,messF2,messF3为File菜单的下拉内容messF2 db '| Write|'messF3 db '| Close|'messE1 db '| Copy |' ; messE1,messE2,messE3为Edit菜单的下拉内容messE2 db '| Paste|'messE3 db '| Cut |'messR1 db '| Dos |' ; messR1,messR2,messR3为Run菜单的下拉内容messR2 db '| Tasm|'messR3 db '|Tlink|'messC1 db '| Green |' ; messC1,messC1,messC1为Color菜单的下拉内容messC2 db '| Red |'messC3 db '| Blue |'messH1 db '| Help?|' ; messH1,messH2,messH3为Help菜单的下拉内容messH2 db '| About|'messH3 db ' 'messoo db ' '; message1,message2,message3,message4为程序中所用到的提示信息message1 db ' Press Blank Start And then Press Blank Complete'message2 db ' Made by Gaobing,Zhangyiwei,Qixinhuan,Zhangfan.'message3 db ' Mail to : cbf107@ or qipai@ 'message4 db 'Press "cursor right" to right "cursor left" to left'extra ends;-------------------------------------------------------------code segmentmain proc farassume cs:code,es:extrastart:mov ax,extramov es,ax;初始界面----------------------------------------------------call page_start ;page_start子程序为初始页面的绘制;主程序------------------------------------------------------call begin ;判断是否进入程序(ENTER进入 ESC退出)m1: getchar2 4dh,ff ;判断是否为"向右"若是则跳到ff(File菜单); ; 宏getchar2为从键盘输入字符,若为ESC则退出,若不为则比较实参1(给出扫描码)相同跳到实参2(标号)处 eqto hh ;判断是否为"向左"若是则跳到hh(Help菜单);宏eqto为判断上一句的比较结果,若结果等于则跳转到实参(标号)处call F_E_R_C_H ;F_E_R_C_H子程序为判断是否按"F,E,R,C,H键,如果按了就分别跳到转移到ff,ee,rr,cc,hh jmp m1;-------------------------------------------------------------宏M为打开一下拉菜单打开后的执行过程,参数见Macrow.asm说明hh: ;Help菜单M h,hh,messH1,messH2,messH3,21h,08h,h1,h2,h3,h3a,h3b,h3c,ff,cc,help1,help2,help3;-------------------------------------------------------------ff: ;File菜单M f,ff,messF1,messF2,messF3,1h,08h,f1,f2,f3,f3a,f3b,f3c,ee,hh,file1,file2,file3;-------------------------------------------------------------ee: ;Edit菜单M e,ee,messE1,messE2,messE3,9h,08h,e1,e2,e3,e3a,e3b,e3c,rr,ff,edit1,edit2,edit3;-------------------------------------------------------------rr: ;Run菜单M r,rr,messR1,messR2,messR3,11h,07h,r1,r2,r3,r3a,r3b,r3c,cc,ee,run1,run2,run3;-------------------------------------------------------------cc: ;Color菜单M c,cc,messC1,messC2,messC3,18h,09h,c1,c2,c3,c3a,c3b,c3c,hh,rr,color1,color2,color3;-------------------------------------------------------------exit: ;退出mov ah,0 ;调用BIOS中段ah=0,al=03以彩色方式mov al,03hint 10hmov ah,4ch ;返回Dosint 21hmain endp;子程序-------------------------------------------------------------------------------------;初始化页面---------------------------------------------------;宏window绘制窗体,参数分别为左上角行号,左上角列号,右下角行号,右下角列号,卷入行属性,上卷行数,AL=0时整个窗口空白;宏output输出字符串,参数为字符串,字符串长度,起始行,起始列,页号,字符串属性page_start proc near;;初始背景--------------------------window 0h,0h,24h,79h,10h,0h ;10h为蓝色window 0h,0h,0h,79h,70h,0h ;70h为白色window 17h,0h,24h,79h,70h,0h;添加画线和注释--------------------output mess0,50h,1h,0h,0h,70h ;70h为白底黑字output mess0,50h,17h,0h,0h,70houtput mess0,50h,08h,0h,0h,07h ;07h为黑底白字output mess1,19h,18h,5h,0h,70houtput mess2,16h,18h,30h,0h,70houtput mess3,0ch,07h,0h,0h,1fh ;1fh为蓝底白字;初始菜单栏-------------------------output messF,8h,0h,1h,0h,70houtput messE,8h,0h,9h,0h,70houtput messR,8h,0h,11h,0h,70houtput messC,9h,0h,18h,0h,70houtput messH,8h,0h,21h,0h,70hpage_start endp;判断是否按 ENTER 或 ESC, ENTER进入 ESC退出;宏getchar1从键盘输入字符(比较输入字符与实参1(ASCII码),若相等则跳到实参2(标号))begin proc nearn1:getchar1 1bh,exitcmp al,0dh ;比较输入字符和0dh(Enter的ASCII码)jz n2jmp n1n2:retbegin endp;判断是否按"F,E,R,C,H键,如果按了就按以下跳转转移----------------F_E_R_C_H proc nearcmp al,66h ;比较输入字符和66h(f的ASCII码)eqto ff ;File菜单cmp al,65h ;比较输入字符和65h(e的ASCII码)eqto ee ;Edit菜单cmp al,72h ;比较输入字符和72h(r的ASCII码)eqto rr ;Run菜单cmp al,63h ;比较输入字符和63h(c的ASCII码)eqto cc ;Color菜单cmp al,68h ;比较输入字符和68h(h的ASCII码)eqto hh ;Help菜单retF_E_R_C_H endp;-------------------------------------------------------------------------------------------;f,e,r,c,h子程序是分别改变主菜单中File,Edit,Run,Color,Help的颜色属性;宏top_line 第一行菜单中各菜单的属性,参数分别为File菜单,Edit菜单,Run菜单,Color菜单,Help菜单的属性;file菜单弹出file窗口显黑底白字f proc neartop_line 07h,70h,70h,70h,70h ;70h为白底黑字,07h为黑底白字getchar1 1bh,exitjmp f1retf endp;-------------------------------------------------;edit菜单弹出edit窗口显黑底白字e proc neartop_line 70h,07h,70h,70h,70h ;70h为白底黑字,07h为黑底白字getchar1 1bh,exitjmp e1rete endp;-------------------------------------------------;run菜单弹出run窗口显黑底白字r proc neartop_line 70h,70h,07h,70h,70h ;70h为白底黑字,07h为黑底白字getchar1 1bh,exitjmp r1retr endp;-------------------------------------------------;color菜单弹出color窗口显黑底白字c proc neartop_line 70h,70h,70h,07h,70h ;70h为白底黑字,07h为黑底白字getchar1 1bh,exitjmp c1retc endp;-------------------------------------------------;help菜单弹出help窗口显黑底白字h proc neartop_line 70h,70h,70h,70h,07h ;70h为白底黑字,07h为黑底白字getchar1 1bh,exitjmp h1reth endp;------------------------------------------------------------------------------------------;file菜单中的子程序;按下File菜单中第一条菜单(New)后执行命令[新建窗口]file1 proc nearcall page_startjmp m1retfile1 endp;-----------------------;按下File菜单中第二条菜单(Write)后执行命令[按空格开始在Watch Window中输入字符串,再次按空格则结束] file2 proc nearmov cl,20houtput message1,38h,07h,17h,0h,70hfind:mov ah,2hmov bh,0hmov dh,9hmov dl,2hint 10h ;BIOS 10h中断ah=2h,置光标位(bh为页号,dh为行号,dl为列号) getchar1 20h,writejmp findwrite:mov ah,1h ;DOS 21h中断 ah=1h,输入并回显字符int 21hcmp al,20hjz overinc cljmp writeover:jmp m1retfile2 endp;-----------------------;按下File菜单中第三条菜单(Close)后执行命令file3 proc nearjmp exitretfile3 endp;-------------------------------------------------------------;edit菜单中的子程序;按下Edit菜单中第一条菜单(Copy)后执行命令edit1 proc nearjmp m1retedit1 endp;-----------------------;按下Edit菜单中第二条菜单(Paste)后执行命令edit2 proc nearjmp m1retedit2 endp;-----------------------;按下Edit菜单中第三条菜单(Cut)后执行命令edit3 proc nearjmp m1retedit3 endp;-------------------------------------------------------------;按下Run菜单中第一条菜单(Dos)后执行命令;run菜单中的子程序run1 proc nearjmp m1retrun1 endp;-----------------------;按下Run菜单中第二条菜单(Tasm)后执行命令run2 proc nearjmp m1retrun2 endp;-----------------------;按下Run菜单中第三条菜单(Tlink)后执行命令run3 proc nearjmp m1retrun3 endp;-------------------------------------------------------------;color菜单中的子程序;按下Color菜单中第一条菜单(Green)后执行命令color1 proc nearwindow 0h,0h,24h,79h,10h,0hwindow 09h,0h,24h,79h,20h,0h ;设置Watch Window窗口颜色为绿色(20h为绿色)window 0h,0h,0h,79h,70h,0hwindow 17h,0h,24h,79h,70h,0houtput mess0,50h,1h,0h,0h,70houtput mess0,50h,17h,0h,0h,70houtput mess0,50h,08h,0h,0h,07houtput mess1,19h,18h,5h,0h,70houtput mess2,16h,18h,30h,0h,70houtput mess3,0ch,07h,0h,0h,1fhoutput messF,8h,0h,1h,0h,70houtput messE,8h,0h,9h,0h,70houtput messR,8h,0h,11h,0h,70houtput messC,9h,0h,18h,0h,70houtput messH,8h,0h,21h,0h,70hjmp m1retcolor1 endp;-------------------------------------------------------------;按下Color菜单中第二条菜单(red)后执行命令color2 proc nearwindow 0h,0h,24h,79h,10h,0hwindow 09h,0h,24h,79h,0c0h,0h ;设置Watch Window窗口颜色为红色(0c0h为红色)window 0h,0h,0h,79h,70h,0hwindow 17h,0h,24h,79h,70h,0houtput mess0,50h,1h,0h,0h,70houtput mess0,50h,17h,0h,0h,70houtput mess0,50h,08h,0h,0h,07houtput mess1,19h,18h,5h,0h,70houtput mess2,16h,18h,30h,0h,70houtput mess3,0ch,07h,0h,0h,1fhoutput messF,8h,0h,1h,0h,70houtput messE,8h,0h,9h,0h,70houtput messR,8h,0h,11h,0h,70houtput messC,9h,0h,18h,0h,70houtput messH,8h,0h,21h,0h,70hjmp m1retcolor2 endp;-------------------------------------------------------------;按下Color菜单中第三条菜单(Blue)后执行命令color3 proc nearwindow 0h,0h,24h,79h,10h,0hwindow 09h,0h,24h,79h,10h,0h ;设置Watch Window窗口颜色为蓝色(10h为蓝色) window 0h,0h,0h,79h,70h,0hwindow 17h,0h,24h,79h,70h,0houtput mess0,50h,1h,0h,0h,70houtput mess0,50h,17h,0h,0h,70houtput mess0,50h,08h,0h,0h,07houtput mess1,19h,18h,5h,0h,70houtput mess2,16h,18h,30h,0h,70houtput mess3,0ch,07h,0h,0h,1fhoutput messF,8h,0h,1h,0h,70houtput messE,8h,0h,9h,0h,70houtput messR,8h,0h,11h,0h,70houtput messC,9h,0h,18h,0h,70houtput messH,8h,0h,21h,0h,70hjmp m1retcolor3 endp;-------------------------------------------------------------;help菜单中的子程序;按下Help菜单中第一条菜单(Help?)后执行命令help1 proc nearoutput message4,33h,0ch,10h,0h,70h ;输出字符串jmp m1rethelp1 endp;-----------------------;按下Help菜单中第而二条菜单(About)后执行命令help2 proc nearoutput message2,33h,0ch,10h,0h,70h ;输出字符串output message3,31h,0eh,11h,0h,70hjmp m1rethelp2 endp;-----------------------;按下Help菜单中第而三条菜单()后执行命令help3 proc nearjmp m1rethelp3 endp;------------------------------------------------------------------------------------------- code endsend start。
汇编语言程序设计的实验环境及上机步骤
汇编语言程序设计的实验环境及上机步骤一、实验环境汇编语言程序设计的实验环境如下:1.硬件环境微型计算机(Intel x86系列CPU)一台2.软件环境⏹Windows98/2000/XP操作系统⏹任意一种文本编辑器(EDIT、NOTEPAD(记事本)、UltraEDIT等)⏹汇编程序(MASM.EXE或TASM.EXE)⏹连接程序(LINK.EXE或TLINK.EXE)⏹调试程序(DEBUG.EXE或TD.EXE)文本编辑器建议使用EDIT或NOTEPAD,汇编程序建议使用MASM.EXE,连接程序建议使用LINK.EXE,调试程序建议使用TD.EXE。
二、上机实验步骤注:以下步骤适用于除汇编语言程序设计的实验一到实验四外的所有实验(实验一到实验四仅使用TD.EXE)。
1.确定源程序的存放目录建议源程序存放的目录名为ASM(或MASM),并放在C盘或D盘的根目录下。
如果没有创建过此目录,请用如下方法创建:通过Windows的资源管理器找到C盘的根目录,在C盘的根目录窗口中点击右键,在弹出的菜单中选择“新建”→“文件夹”,并把新建的文件夹命名为ASM。
请把MASM.EXE、LINK.EXE、DENUG.EXE和TD.EXE都拷贝到此目录中。
2.建立ASM源程序建立ASM源程序可以使用EDIT或NOTEPAD(记事本)文本编辑器。
下面的例子说明了用EDIT文本编辑器来建立ASM源程序的步骤(假定要建立的源程序名为HELLO.ASM),用NOTEPAD(记事本)建立ASM源程序的步骤与此类似。
在Windows中点击桌面左下角的“开始”按钮→选择“运行”→在弹出的窗口中输入“ C:\ASM\HELLO.ASM”,屏幕上出现EDIT的编辑窗口,如图1所示。
图1 文本编辑器EDIT的编辑窗口窗口标题行显示了EDIT程序的完整路径名。
紧接着标题行下面的是菜单行,窗口最下面一行是提示行。
菜单可以用Alt键激活,然后用方向键选择菜单项,也可以直接用Alt-F打开File文件菜单,用Alt-E打开Edit编辑菜单,等等。
汇编语言软件程序设计参考程序
汇编语言软件程序设计
设计一:汇编语言菜单程序设计
编程要求:
编写程序,在文本方式下显示—个英文菜单。
要求分别显示“FILE”,“EDIT’"PROCESSING”,“QUIT”四个菜单,并对每项菜单的输入有所响应。
编程指导:
菜单设计,首先应安排好菜单在显示器的显示式样.同时可输入菜单命令,相应的菜单项进入响应。
同时也应对不正确的输入命令做出反应。
参考程序:
设二:汽车动态行驶动画设计
设计说明:
小车在公路上动态行驶,从屏幕左侧驶向屏幕右侧。
在到达屏幕右侧后,公路下降一段距离并改变颜色,然后小车继续由左向右行驶。
当下降到屏幕底部时,又返回到屏幕顶部重复上述过程.
参考程序:
带显示界面加法器汇编程序设计
设计说明:
用汇编语言设计—个加法器,实现加法求和运算。
为了便于操作,设计一个简单的加法器菜单界面,所有数据在菜单界面上输入(被加数,加数不足三位时前面以0补足三位),输出结果也在菜单界面上显示。
按回车键则退出加法器菜单界面并返回Dos系统,否则继续进行加法运算。
加法器菜单界面如下图所示。
第4章 汇编语言程序设计
例: 三字节无符号数相加,其中被加数在内部RAM 的50H、51H和52H 单元中;加数在内部RAM的53H、 54H和55H单元中;要求把相加之和存放在50H、 51H和52H单元中,进位存放在位寻址区的00H位中。
内部RAM
50H 51H 52H
高字节 低字节
53H 54H 55H
R1→55H
结 束
常用程序结构:
顺序程序、分支程序、循环程序。
4-3
顺序程序
顺序程序又称简单程序,程序走向只有一条路径。 例:双字节求补程序(设数据在R4R5中): 开 始 CLR C MOV A,R5 ;取低字节 处 理 CPL A ADD A,#01H ;低字节变补 处 理 MOV R5,A MOV A, R4 ;取高字节 处 理 CPL A ADDC A,#00H ;高字节变补 结 束 MOV R4,A
片内 RAM 42H 0 十 41H 0 个 40H 十 个
4 -- 4
分支程序(参见书P49-57)
分支程序就是在程序执行过程中要判 断某些条件,当条件成立后程序转移到不 同的功能处运行。在MCS-51单片机中条件 转移指令都可以用在分支程序中。 (复习、参见书P38---39) (1)测试条件符合转移,如: JZ、JNB …等
汇编的主要任务:
1)确定程序中每条汇编语言指令的指令机器码。 2)确定每条指令在存储器中的存放地址。 3)提供错误信息。 4)提供目标执行文件(*.OBJ/*.HEX)和 列表文件(*.LST)。
一、汇编语言指令类型:
1. 机器指令: 指令系统中的全部指令,每条指令有对应的机器代码。 2. 伪指令: 汇编控制指令,仅提供汇编信息,没有指令代码。
在源程序中只能有一条END指令
8086汇编语言程序设计
8086汇编语言程序设计
(1)汇编语言介绍
汇编语言(简称汇编)是一种低级语言,它能够与计算机硬件的指令
指令很好地接轨,是一种可靠的,有效的,灵活的编程语言。
主要用于编
写微型机,微处理器,单片机及PC机的程序。
汇编器是汇编语言的翻译器,它将高级语言(如C、C++等)翻译为机器语言指令,以达到执行程
序源代码的目的。
汇编语言程序设计(Assembly Language Programming)是以汇编语
言编写程序以满足特定应用的过程。
它主要用于写微机、微处理器等的控
制程序和系统程序,具有立即计算,快速反应,低耗能,成本低廉的优点。
(2)汇编语言编程
汇编语言编程主要是为了让CPU以机器语言运行,编程时可使用指令
集合或者标准指令。
根据指令可以让CPU执行计算机的功能,原理上看,
汇编语言编程是一种字节操作。
汇编程序编程需要使用CPU的指令集,这些指令可以被用来控制CPU
执行。
指令集又可分为实指令集和抽象指令集。
对于不同的CPU,他们的
指令集也是不一样的,因此需要根据CPU的不同选择合适的指令集。
在汇编语言编程中,常见的指令有加法,减法,乘法,除法,移位,
现行,条件转移等等。
汇编语言程序设计步骤
汇编语言程序设计步骤一、引言汇编语言是一种底层的计算机语言,用于编写机器指令,控制计算机硬件。
它是一种直接操作计算机硬件的语言,因此在编写汇编语言程序时需要遵循一系列步骤,以确保程序的正确性和高效性。
二、程序设计步骤1. 确定程序的目标和需求:在编写汇编语言程序之前,我们首先需要明确程序的目标和需求。
这包括程序要实现的功能、输入和输出的格式等。
2. 设计程序的算法:根据程序的目标和需求,我们需要设计程序的算法。
算法是程序的核心,它描述了解决问题的步骤和方法。
在设计算法时,我们需要考虑程序的效率和可读性。
3. 编写程序的伪代码:在正式编写汇编语言程序之前,我们可以先编写程序的伪代码。
伪代码是一种类似自然语言的描述,用于描述程序的逻辑结构和算法。
编写伪代码可以帮助我们更清晰地理解程序的逻辑。
4. 编写汇编语言程序:在编写汇编语言程序时,我们需要根据程序的伪代码,使用汇编语言的指令和语法,逐步实现程序的功能。
编写程序时,需要注意变量的定义、指令的顺序和循环结构的使用等。
5. 进行程序的测试和调试:编写完汇编语言程序后,我们需要进行测试和调试。
通过输入不同的数据,检查程序的输出是否符合预期。
如果程序出现错误或bug,我们需要通过调试,找出错误的原因并进行修复。
6. 优化程序的性能:为了提高程序的执行效率,我们可以对程序进行优化。
优化的方法包括改进算法、减少指令的使用和优化内存的访问等。
通过优化程序,可以使程序更快速地运行。
7. 文档化和维护程序:编写完汇编语言程序后,我们需要撰写程序的文档,包括程序的功能、输入和输出的格式、程序的使用方法等。
同时,还需要对程序进行维护,及时修复bug和添加新的功能。
三、总结汇编语言程序设计是一项复杂而重要的任务。
通过遵循上述步骤,我们可以编写出高质量、高效率的汇编语言程序。
同时,编写汇编语言程序也需要耐心和细心,不断学习和积累经验,以提升自己的编程能力。
通过不断的实践和学习,我们可以成为一名优秀的汇编语言程序员。
《第一单元 Visual Basic初步 第6课 制作菜单 编写程序菜单》作业设计方案-初中信息技术
《编写程序菜单》作业设计方案(第一课时)一、作业目标本次作业旨在帮助学生掌握编写程序菜单的基本概念和技能,提高他们的编程能力和问题解决能力。
通过完成作业,学生将能够独立编写简单的程序菜单,了解菜单设计的基本要素和流程。
二、作业内容任务一:设计一个简单的菜单界面要求:1. 使用文本框创建一个菜单界面,至少包含五个菜品选项。
2. 每个菜品选项下方留出空行,以便后续添加菜品描述和价格。
3. 菜单界面大小适中,便于用户查看和操作。
任务二:编写程序菜单逻辑要求:1. 根据菜单界面中的菜品选项,编写相应的代码逻辑,实现点餐功能。
2. 用户输入菜品选项后,程序应显示该菜品的名称和价格。
3. 用户确认购买后,程序应记录菜品信息和购买数量。
三、作业要求1. 学生需独立完成作业,不得抄袭或使用他人代码。
2. 作业中使用的文本框、代码等素材请自行准备或自行搜索下载。
3. 作业应在规定时间内提交,时间安排为一周(5个工作日)。
4. 提交作业时,请附上对作业的理解和设计思路,以便教师评估和指导。
四、作业评价1. 教师将根据学生的作业完成情况、代码逻辑的正确性和创新性等方面进行评价。
2. 评价结果将作为学生平时成绩的参考,以激励学生积极参与作业,提高编程能力。
3. 对于在作业中遇到困难的学生,教师将给予指导和帮助,鼓励他们坚持完成作业。
五、作业反馈1. 学生可随时向教师咨询作业中的问题和困惑,寻求帮助和指导。
2. 教师将定期收集学生反馈,了解学生对作业的看法和建议,以便不断改进和优化作业设计方案。
3. 鼓励学生在完成作业后分享自己的经验和成果,与其他同学交流学习。
通过本次作业,学生将能够掌握编写程序菜单的基本知识和技能,提高他们的编程能力和问题解决能力。
同时,教师将根据学生的反馈和表现,不断调整和优化作业设计方案,以满足学生的学习需求和提高教学质量。
作业设计方案(第二课时)一、作业目标通过本次作业,学生将进一步巩固和掌握编写程序菜单的基本知识和技能,提高编程能力和问题解决能力。
汇编语言菜单系统
else if (ah==下光标键)
{修正行值}
}
}
while (al!=Esc)
6.实验步骤
运行“光标漫游示例.EXE”了解需求。
①编一小程序获得特殊键“→、←、↑、↓”“Esc、回车”等的扫描码和Asc码值,并记录以备后用;
②写出光标漫游的算法(保存,用类自然语言描述,用word,与同学、老师讨论算法的可行性与正确性);
③在②初步正确的基础上,编写汇编语言源程序;
④如发现算法问题,用调试器调试;
7.要点
光标如何根据所按的键跟随?折返如何处理?x=(x+1) %25;
8.该实验与大实验的关联性
请大家体会主菜单“实验蓝本.exe”的处理过程。
附件:实验报告内容
①问题
②设计要点及算法
③源程序
④运行结果
⑤使用调试器状况和经验总结
;返回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
//显示最后一行
}
ShowALineOfBox(左上角坐标,宽度,方框子串,颜色)
{//定位光标
//设置颜色并显示第一字符
//for显示中间字符
//显示最后一字符
}
5.实验关键
先实现ShowALineOfBox子程序,编程时考虑模块化的概念,处理参数的传递方法(先采用变量或寄存器的方式来传送)。参考下列案例:
汇编程序设计进阶教程
汇编程序设计进阶教程(中英文实用版)Title: Advanced Assembly Language Programming Tutorial标题:汇编语言编程进阶教程Section 1: Introduction to Assembly Language第一部分:汇编语言简介In this section, we will delve deeper into the world of assembly language programming.Assembly language is a low-level programming language that is used to program a computer"s central processing unit (CPU).It is a human-readable representation of the machine code that the CPU understands.In this tutorial, we will cover the basics of assembly language, including instructions, registers, memory, and input/output operations.在本节中,我们将更深入地了解汇编语言编程。
汇编语言是一种低级编程语言,用于编程计算机的中央处理单元(CPU)。
它是CPU理解的机器代码的可读人类表示。
在本教程中,我们将介绍汇编语言的基本知识,包括指令,寄存器,内存和输入/输出操作。
Section 2: Assembly Language Syntax第二部分:汇编语言语法Assembly language uses a set of mnemonic codes to represent machine instructions.These mnemonic codes are easier for humans to understand and remember compared to raw machine code.In this section,we will learn about the syntax of assembly language, including instructions, operands, and comments.We will also explore the different types of instructions in assembly language, such as arithmetic, logical, data transfer, and control instructions.汇编语言使用一组助记码来表示机器指令。
(完整版)汇编语言程序设计实验篇(emu8086),推荐文档
按钮,保存相应的程序段。
2. EXE TEMPLATE 程序
本章与 DOS 功能调用和汇编源程序相关的实验都是用 EXE TEMPLATE 程序完成的。
打开 emu8086,在“welcome…”对话框中,单击
按钮,创ቤተ መጻሕፍቲ ባይዱ文件。
我去人也就有人!为UR扼腕入站内信不存在向你偶同意调剖沙
在“choose code template”对话框中,选择“EXE template-advanced executable
3. 实验原理
通用数据传送指令包括:1)通用数据传送指令,如 MOV,PUSH,POP,XCHG,CBW,CWD;2)目标地址传送指令,如 LDS,LES;3)标志传送指令,如 LAHF,SAHF,PUSHF,POPF;4)输入输出指令,如 IN,OUT,LEA
寻址方式包括:1)立即寻址;2)直接寻址;3)寄存器寻址;4)寄存器间接寻值; 5)寄存器相对寻址;6)基址-变址寻址;7)基址—变址—相对寻址;8)隐含寻址
逻辑运算指令包括:AND,OR,NOT,XOR,TEST
4. 实验内容
(1)创建 COM TEMPLATE 程序,输入以下程序段,单步执行并记录标志位的变化情况
(提示:在 emulator 对话框中,单击
按钮察看标志寄存器的值)。程序段及结果表
格如表 1-2。 表 1-2 算术逻辑运算实验结果表格
标志位 CF ZF SF OF PF AF
4. 实验内容
(1)创建 COM TEMPLATE 程序,输入以下程序段,观察程序的执行情况,程序段如下:
MOV BL,08H
;BX=?
MOV CL,BL
;CL=?
MOV AX,03FFH
汇编语言程序设计课程论文-汇编语言实现命令菜单设计
华南师范大学增城学院课程论文题目:汇编语言实现命令菜单设计课程名称汇编语言程序设计考查学期 2011/2012 学年第一学期考查方式课程论文姓名学号专业 10级计算机系软件工程成绩指导教师汇编语言是很多相关课程(如数据结构、操作系统、微机原理等)的重要基础。
由于我们的工作平台、研究对象都是机器,汇编语言是人和计算机沟通的最直接的关系方式,所以汇编语言的基础是必不可缺的。
通过汇编语言程序设计来学习关键指令,从而深入理解机器工作的基本原理,培养底层编程意识和思想。
本次程序设计的要求为:使用彩色字符显示模式设计命令菜单,菜单选项至少3个,实现程序运行时,选择不同的菜单可以运行不同的子程序,实现不同的功能,命令菜单位置屏幕居中显示。
根据要求分析,可将程序设计分为3个步骤进行。
第一步就是对显示命令菜单进行编写,第二步就是对3个子程序分别的进行编写,第三步就是把显示命令菜单与3个子程序进行连接并进行调试。
显示命令菜单的程序如下所示:assume cs:codecode segmentstart:;-------------主菜单-------------------------menu db ' Main Menu ',0menu1 db ' 1) sentence ',0menu2 db ' 2) amend letter ',0menu3 db ' 3) clock ',0menu4 db ' ',0menu5 db ' Please press 1 ~ 3 ',0menu6 db ' ',0menu_address dw menu,menu1,menu2,menu3,menu4,menu5,menu6 ;菜单地址colour db 0 ;显示颜色; ----------------------显示主菜单-------------------------m: call clspush cspop dsmov bx,0mov dh,8mov dl,25mov cx,7mov colour,2m1: mov si,menu_address[bx]call showinc dhadd bx,2loop m1mov ah,2mov bh,0mov dh,14mov dl,54int 10h ;置光标mov ax,4c00hint 21h; -----------------------功能: 清屏--------------------- cls: push bxpush cxpush esmov bx,0b800hmov es,bxmov bx,0mov cx,2000cls1:mov byte ptr es:[bx],' 'add bx,2loop cls1pop espop cxpop bxret;-------------------------功能: 显示字符串--------------------- ;参数: ds:si 指向字符串首地址,字符串以0结尾, (dh)=行号, (dl)=列号,colour存放字符颜色show : push axpush bxpush cxpush dxpush dipush sipush esmov bx,0b800hmov es,bxmov al,160mul dhmov di,axadd dl,dlmov dh,0add di,dxmov ah,colourshow1: mov ch,0mov cl,[si]jcxz show_end mov al,clmov es:[di],ax inc siadd di,2jmp show1show_end: pop espop sipop dipop dxpop cxpop bxpop axretcode endsend start子程序1——指定字符串的输出显示在屏幕上程序如下所示:assume cs:codedata segmentdb "welcome to masm!",0data endscode segmentstart:mov ax, 0mov es, axmov di, 200Hmov ax, csmov ds, axmov si, offset r_begmov cx, offset r_end - offset r_beg cldrep movsbmov ax, 0mov ds, axmov word ptr ds:[7cH*4], 200hmov word ptr ds:[7cH*4 + 2], 0mov dh,10mov dl,10mov cl,2mov ax,datamov ds,axmov si,0int 7chmov ax, 4c00Hint 21Hr_beg:push cxpush simov ax, 0b800Hmov es, axmov al, 160mul dhmov dh, 0add ax, dx ;设置di=160*dh+dl*2 add ax, dxmov di, axlp:cmp byte ptr ds:[si], 0je okmov ch, ds:[si]inc simov es:[di], chmov es:[di+1], cladd di, 2jmp short lpok:pop sipop cxiretr_end:nopcode endsend start子程序2——输入一单词,并将单词所有字母改为大写显示程序如下所示:assume cs:codedata segmentdb "conversation",0 data endsstack segmentdw 80 dup (0) stack endscode segmentstart:mov ax,datamov ds,axmov ax,stack mov ss,axmov sp,0a0h mov si,0call lettermov dh,21 ;行号 mov dl,1 ;列号 call showmov ax,4c00h int 21h letter:mov ch,0mov cl,ds:[si]jcxz okmov al,ds:[si]cmp al,61Hjnb p1inc sijmp short letterp1:cmp al,7aHjna t0inc sijmp short lettert0:sub al,20Hmov ds:[si],alinc sijmp short letter ok:retshow:mov ax,0a0h ;算出行 mul dhmov bx,axmov ax,2h ;算出列mul dlmov di,axmov si,0mov ax,0b800hmov es,axchange:mov cl,ds:[si]mov ch,0jcxz ok1 ;判断0结束字符push ds:[si] ;把字符串放入栈中pop es:[bx].[di] ;从栈中取出字符放入显示区的偶地址中mov ax,2 ;绿色属性mov es:[bx].[di].1,ax ;颜色字符放入奇地址中add di,2inc sijmp short changeok1:retcode endsend start子程序3——显示系统日期程序如下所示:assume cs:code,ds:datadata segmentdb 'yy/mm/dd hh:mm:ss'db 9,8,7,4,2,0 ;CMOS中时间信息的单元号data endsstack segmentdw 8 dup(0)stack endscode segmentstart:mov bx,datamov ds,bxmov bx,stackmov ss,bxmov sp,16dmov si,0 ;si指向'yy/mm/dd hh:mm:ss'的首地址mov di,17d ;di指向9,8,7,4,2,0的首地址mov cx,6 ;循环次数s: push cxmov al,ds:[di] ;从CMOS中读出年份的BCD码out 70h,alin al,71hmov ah,al ;al中位读出的数据mov cl,4shr ah,cl ;ah中为年份的十位数and al,00001111b ;al中为年份的个位数add ah,30h ;把数值转换为对应的ASCII码add al,30h ;同上mov byte ptr ds:[si],ah ;把读出的时间写入ds段mov byte ptr ds:[si+1],aladd si,3inc dipop cxloop s;把读出的内容按yy/mm/dd hh:mm:ss的格式写显存mov bx,0b800hmov es,bxmov ch,ds:[0]mov byte ptr es:[160*16+26*2],chmov cl,ds:[1]mov byte ptr es:[160*16+26*2+2],clmov cl,ds:[2]mov byte ptr es:[160*16+26*2+4],clmov ch,ds:[3]mov byte ptr es:[160*16+26*2+6],chmov cl,ds:[4]mov cl,ds:[5]mov byte ptr es:[160*16+26*2+10],cl mov ch,ds:[6]ov byte ptr es:[160*16+26*2+12],ch mov cl,ds:[7]mov byte ptr es:[160*16+26*2+14],cl mov cl,ds:[8]mov byte ptr es:[160*16+26*2+16],cl mov ch,ds:[9]mov byte ptr es:[160*16+26*2+18],ch mov cl,ds:[10]mov byte ptr es:[160*16+26*2+20],cl mov cl,ds:[11]mov byte ptr es:[160*16+26*2+22],cl mov ch,ds:[12]mov byte ptr es:[160*16+26*2+24],ch mov cl,ds:[13]mov byte ptr es:[160*16+26*2+26],cl mov cl,ds:[14]mov byte ptr es:[160*16+26*2+28],cl mov ch,ds:[15]mov cl,ds:[16]mov byte ptr es:[160*16+26*2+32],cl;调用int 16h的1号功能,从键盘缓冲区读字符mov ah,1int 16hcmp al,'q' ;若按q键则退出程序je exitjmp start ;使程序反复读CMOS,从而实现动态显示时间exit: mov ax,4c00hint 21hcode endsend start显示命令菜单与3个子程序合并的程序如下所示:assume cs:codedata1 segmentdb "welcome to masm!",0data1 endsdata2 segmentdb "conversation",0data2 endsstack segmentdw 80 dup (0)stack endscode segmentstart:org 7e00h ;因为后面引导系统要从7c00h开始要存放512字节的引导程序,所以程序从7e00h开始存放jmp m;-------------主菜单-------------------------menu db ' Main Menu ',0menu1 db ' 1) sentence ',0menu2 db ' 2) amend letter ',0menu3 db ' 3) clock ',0menu4 db ' ',0menu5 db ' Please press 1 ~ 3 ',0menu6 db ' ',0menu_address dw menu,menu1,menu2,menu3,menu4,menu5,menu6 ;菜单地址t1 db '20**/**/** **:**:**',0 ;显示时间的格式t2 db 9,8,7,4,2,0 ;CMOS单元地址t3 dw t1 ;位置colour db 0 ;显示颜色gb db 33 ;光标位置,在后面设置时间要用到;-------------------------显示主菜单------------------------ m: call clspush cspop dsmov bx,0mov dh,8mov dl,25mov cx,7mov colour,2m1: mov si,menu_address[bx]call showinc dhadd bx,2loop m1mov ah,2mov bh,0mov dh,14mov dl,54int 10h ;置光标;-------------------------选择功能---------------------------- mov ah,0int 16hcmp al,'1'je sentencecmp al,'2'je amend_lettercmp al,'3'je clockjmp m ;返回菜单,等待用户选择;-------------- 指定字符串的输出显示在屏幕上--------------sentence:call s1ret;-------- 输入一单词,并将单词所有字母改为大写显示-------amend_letter:call s2ret;---------------------------动态显示时间---------------------------- clock:call clsc_1: mov si,0mov di,2mov cx,6mov ah,2mov bh,0mov dh,11mov dl,50int 10h ;置光标c_2: mov al,t2[si]out 70h,alin al,71hmov ah,alshr ah,1shr ah,1shr ah,1shr ah,1and al,00001111badd ah,30hadd al,30hmov t1[di],ahmov t1[di+1],alinc siadd di,3loop c_2mov dh,11mov dl,31mov si,t3call showin al,60hcmp al,01hje GOm ; 因为位移超过了128,所以用GOm来间接返回主菜单 cmp al,3bhje c_4c_3: jmp c_1c_4: inc byte ptr colourand colour,00001111bjmp c_3GOm: jmp m ;间接跳转回主菜单;-------------------------初始化显示格式----------------csh: push sipush dipush cxpush cspop esmov si,t3[4]mov di,t3[2]mov cx,18cldrep movsbmov gb,33pop cxpop dipop siret;=========================子程序区=============================s1:mov ax, 0mov es, axmov di, 200Hmov ax, csmov ds, axmov si, offset r_begmov cx, offset r_end - offset r_beg cldrep movsbmov ax, 0mov ds, axmov word ptr ds:[7cH*4], 200hmov word ptr ds:[7cH*4 + 2], 0mov dh,10mov dl,10mov cl,2mov ax,data1mov ds,axmov si,0retr_beg:push cxpush simov ax, 0b800Hmov es, axmov al, 160mul dhmov dh, 0add ax, dx ;设置di=160*dh+dl*2 add ax, dxmov di, axlp:cmp byte ptr ds:[si], 0je okaymov ch, ds:[si]inc simov es:[di], chmov es:[di+1], cljmp short lpokay:pop sipop cxiretr_end:noprets2:mov ax,data2mov ds,axmov ax,stack mov ss,axmov sp,0a0h mov si,0call lettermov dh,21 ;行号 mov dl,1 ;列号 call show2retletter:mov ch,0mov cl,ds:[si]jcxz okmov al,ds:[si]cmp al,61Hjnb p1inc sijmp short letterp1:cmp al,7aHjna t0inc sijmp short lettert0:sub al,20Hmov ds:[si],alinc sijmp short letter ok:retshow2:mov ax,0a0h ;算出行mul dhmov bx,axmov ax,2h ;算出列mul dlmov di,axmov si,0mov ax,0b800hmov es,axchange:mov cl,ds:[si]mov ch,0jcxz ok1 ;判断0结束字符push ds:[si] ;把字符串放入栈中pop es:[bx].[di] ;从栈中取出字符放入显示区的偶地址中mov ax,2 ;绿色属性mov es:[bx].[di].1,ax ;颜色字符放入奇地址中add di,2inc sijmp short changeok1:ret;---------------------------功能: 清屏------------------------cls: push bxpush cxpush esmov bx,0b800hmov es,bxmov bx,0mov cx,2000cls1:mov byte ptr es:[bx],' 'add bx,2loop cls1pop espop cxpop bxret;-------------------功能: 显示字符串-----------------;参数: ds:si 指向字符串首地址,字符串以0结尾, (dh)=行号, (dl)=列号,colour存放字符颜色show : push axpush bxpush cxpush dxpush dipush sipush esmov bx,0b800hmov es,bxmov al,160mul dhmov di,axadd dl,dlmov dh,0add di,dxmov ah,colourshow1: mov ch,0mov cl,[si]jcxz show_end mov al,clmov es:[di],ax inc siadd di,2jmp show1show_end: pop espop sipop dipop dxpop cxpop bxpop axretcode endsend start通过这个程序设计我最深的体会就是最后把显示命令菜单与3个子程序进行连接并进行调试,这一步是最关键的一步也是最难的一步。
汇编语言菜单程序设计
皖西学院课程设计报告书系别:机电系专业:电子信息科学与技术学生姓名:夏丽学号:20071233 课程设计题目:汇编语言菜单设计起迄日期: 5月22日~6月5日课程设计地点:计算机机房/机电系EDA实验分室指导教师:张斌完成日期: 2010年6月4日目录一设计目的与设计要求 (1)二设计原理 (2)1 windows下模拟DOS环境 (3)三汇编语言程序上机过程 (4)1 工作环境 (5)2 运行汇编语言程序步骤 (6)四程序流程图................................ .7 五心得体会.. (8)六参考资料 (9)摘要上世纪八十年代------随着微软公司的windows操作系统的出现,计算机应用由命令行工作方式逐渐转为图形操作方式,方便了普通用户和计算机交互使用,是计算机软件历史发展上的一个里程碑,计算机软件发展也正式进入了图形操作环境。
本文以常见的X86处理器为平台,使用汇编语言实现菜单显示,近似模拟图形操作的方式。
一.设计目的与设计要求一本次课程设计应达到的目的通过本设计使巩固学生对所学知识的掌握,培养学生运用课程中所学到的理论知识与实践紧密结合,独立地解决实际问题的能力,培养学生运用汇编软件的编程能力和编程技巧,锻炼其运用软件的综合能力。
二本课程设计课题任务的内容和要求(包括原始数据、技术参数、设计要求等):1、编写程序,在文本方式下显示—个英文菜单。
要求分别显示“FILE”,“EDIT”“PROCESSING”’“QUIT”四个菜单,并对每项菜单的输入都有所响应。
2、按某一功能键自动返回DOS ;3、写具体的汇编源程序,画出流程图;二.设计原理本设计使用windows 模拟DOS环境下,使用MASM汇编、编译、调试、连接等工具,使用PC机的键盘和显示器分别做程序的输入输出,实现程序的人机交互。
一 windows下模拟DOS环境DOS 的全名是 Disk Operation System,是PC系统上历史最悠久的操作系统。
汇编 菜单程序设计
DATAS SEGMENTscrmm DB 100 DUP(?);主菜单名menu1 DB'FILE'menu2 DB'Edit'menu3 DB'RUN'menu4 DB'TOOL'menu5 DB'QUIT';主菜单File下子菜单名submenu11 DB'New'submenu12 DB'Open'submenu13 DB'Save';主菜单Edit下子菜单名submenu21 DB'Cut'submenu22 DB'Past'submenu23 DB'Copy';主菜单Run下子菜单名submenu31 DB'Run'submenu32 DB'Go to'submenu33 DB'Step';主菜单Debug下子菜单名submenu41 DB'Call'submenu42 DB'Find'submenu43 DB'Source';主菜单Help下子菜单名submenu51 DB'About'submenu52 DB'Web'submenu53 DB'Exit';窗口信息msg1 DB'Please press Alt+F,Alt+E,Alt+R,Alt+T,Alt+Q or ',19h,' to open the submenu.'msg2 DB'Please press Enter (',11h,0c4h,0d9h,') to open/close the submenu.' msg3 DB'Please press ',1bh,' or ',1ah,' to select the menu.'msg4 DB'Please press ',18h,' or ',19h,' to select the submenu.';msg7 DB ' ';退出信息'over DB'Thank you for uesing,author by Jianhua';其他信息escape DB'Press ESC to exit.'text1 DB'This is a menu program made with assemble.' sub11 DB'Select New'sub12 DB'Select Open'sub13 DB'Select Save'sub21 DB'Select Cut'sub22 DB'Select Past'sub23 DB'Select Copy'sub31 DB'Select Run'sub32 DB'Select Go to'sub33 DB'Select Step'sub41 DB'Select Call'sub42 DB'Select Find'sub43 DB'Select Source'sub51 DB'Select About'sub52 DB'Select Web'sub53 DB'Select Exit';-------------------------num DB 1 ;主菜单序列号subnum DB?;子菜单序列号subshow DB 0 ;为0时子菜单未显示index DB?;主菜单长度;--------------------------------DATAS ENDS;设置光标位置,显示在0页的(top,left)位置pos MACRO top,leftMOV AH,02hMOV BH,0 ;页号MOV DH,topMOV DL,left ;位置INT 10hENDM;修改菜单属性changemenu MACRO top,left,WIDTH,attrLOCAL chgMOV DL,leftchg:pos top,DL ;置光标位置MOV BH,0 ;页号MOV AH,08h ;读光标位置的属性,AH=属性,AL=字符INT 10hMOV BL,attr ;设置属性MOV CX,1 ;字符重复次数MOV AH,09h ;在光标位置显示字符及设置其属性INT 10hINC DLMOV DH,leftADD DH,WIDTHCMP DL,DH ;设置的循环次数控制JNE chgpos top,leftENDM;绘制窗口drawwindow MACRO attr,top,left,bottom,rightPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,06h ;屏幕初始化MOV AL,0 ;全屏为空白MOV BH,attr ;卷入行属性MOV CH,topMOV CL,left ;左上角坐标MOV DH,bottomMOV DL,right;右下角坐标INT 10hPOP DXPOP CXPOP BXPOP AXENDM;绘制窗口上下边框windowtandb MACRO l,m,r,top,left,WIDTH,attrpos top,left ;置光标位置outputchar l,attr,1 ;输出字符,画左上折角pos top,left+1 ;置光标位置outputchar m,attr,WIDTH-2;输出字符,画上边框pos top,left+WIDTH-1 ;置光标位置outputchar r,attr,1 ;输出字符,画右上折角ENDM;绘制窗口左右边框windowlandr MACRO char,top,left,WIDTH,attr pos top,left ;置光标位置outputchar char,attr,1 ;输出字符,画左边框pos top,left+WIDTH-1 ;置光标位置outputchar char,attr,1 ;输出字符,画右边框ENDM;输出outputchar MACRO char,attr,numPUSH AXMOV BH,0 ;页号MOV AH,09hMOV AL,char ;字符MOV BL,attr ;属性MOV CX,num ;重复次数INT 10hPOP AXENDM;输出串outputstr MACRO str,num,top,left,attrPUSH AXPUSH BXPUSH BPPUSH CXPUSH DXMOV AH,13hLEA BP,str ;字串地址送ES:BPMOV CX,num ;长度MOV DH,topMOV DL,left ;位置坐标MOV BH,0 ;页号MOV AL,0 ;写方式MOV BL,attr ;属性INT 10hPOP DXPOP CXPOP BPPOP BXPOP AXENDM;绘制子菜单submenu MACRO left,menu1,num1,menu2,num2,menu3,num3,WIDTH LOCAL menudrawwindow 70h,1,left,5,left+WIDTH ;画子菜单窗口windowtandb 0dah,0c4h,0bfh,1,left,WIDTH+1,70h ;画子菜单上边筐MOV AL,2menu:windowlandr 0b3h,AL,left,WIDTH+1,70h ;画子菜单左右边筐INC ALCMP AL,5JNE menuwindowtandb 0c0h,0c4h,0d9h,5,left,WIDTH+1,70h ;画子菜单下边筐outputstr menu1,num1,2,left+2,0fh ;(2,left+2)显示子菜单1changemenu 2,left+1,8,0fhoutputstr menu2,num2,3,left+2,70h ;(3,left+2)显示子菜单2 changemenu 3,left+2,1,74houtputstr menu3,num3,4,left+2,70h ;(4,left+2)显示子菜单3 changemenu 4,left+2,1,74hENDM;读取屏幕内容readscr MACRO left,memoryLOCAL readSUB AX,AXMOV SI,AXread:ADD AH,leftINC ALINC SIMOV CH,AHpos AL,CH ;置光标位置MOV AH,08h ;读光标位置字符和属性,AH=字符,AL=属性MOV BH,0 ;页号INT 10hMOV memory[SI],AL ;属性保存MOV memory[SI+50],AH;字符保存MOV AX,SIMOV BL,10DIV BLCMP SI,50JNE readENDM;写入屏幕writescr MACRO left,memoryLOCAL writeSUB AX,AXMOV SI,AXwrite:ADD AH,leftINC ALINC SIMOV CH,AHpos AL,CH ;置光标位置MOV AL,memory[SI] ;属性送ALMOV AH,memory[SI+50];字符送AHMOV DL,ALMOV DH,AHoutputchar DL,DH,1 ;输出MOV AX,SIMOV BL,10DIV BLCMP SI,50JNE writeENDM;设置光标属性showcur MACRO showPUSH AXPUSH CXMOV AH,1MOV CH,show ;光标起始行设置MOV CL,0 ;光标结束行设置INT 10hPOP CXPOP AXENDMSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV ES,AX;窗口预置drawwindow 1eh,0,0,24,79 ;画主窗口drawwindow 70h,0,0,0,79 ;画菜单窗口drawwindow 70h,24,0,24,79 ;画副窗口;画主窗口上边框windowtandb 0d5h,0cdh,0b8h,1,0,80,1ehMOV AL,2draw:;画主窗口左右边框windowlandr 0b3h,AL,0,80,1ehINC ALCMP AL,17hJNE draw;画主窗口下边框windowtandb 0c0h,0c4h,0d9h,23,0,80,1eh;***************************************开始主菜单绘制outputstr menu1,4,0,3,0Fh ;输出(串,长度,位置,属性)outputstr menu2,4,0,13,70hchangemenu 0,13,1,74houtputstr menu3,3,0,23,70hchangemenu 0,23,1,74houtputstr menu4,4,0,33,70hchangemenu 0,33,1,74houtputstr menu5,4,0,43,70hchangemenu 0,43,1,74h;***************************************结束主菜单绘制;***************************************窗口提示信息输出outputstr msg1,68,3,5,17h;输出(串,长度,位置,属性)changemenu 3,18,5,1eh ;改变属性(起始位置,重复次数,属性)changemenu 3,24,5,1ehchangemenu 3,30,5,1ehchangemenu 3,36,5,1ehchangemenu 3,42,5,1ehchangemenu 3,51,1,1ehoutputstr msg2,51,6,5,17hchangemenu 6,18,11,1ehoutputstr msg3,40,9,5,17hchangemenu 9,18,1,1ehchangemenu 9,23,1,1ehoutputstr msg4,42,12,5,17hchangemenu 12,18,1,1ehchangemenu 12,23,1,1ehoutputstr escape,18,15,5,17hchangemenu 15,11,3,1ehpos 24,0INPUT: ;消息接收循环MOV AH,0INT 16hCMP AH,01h ;ESC退出JNE continue1 ;否则继续CALL exitcontinue1:CMP AH,4bhJNE continue2CALL prsleft ;按左键跳转JMP inputcontinue2:CMP AH,4dhJNE continue3CALL prsright ;按右键跳转JMP inputcontinue3:CMP AH,50hJNE continue4CALL prsdown ;按下键跳转JMP inputcontinue4:CMP AH,21hJNE continue5MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue5CALL FAlt ;按下ALT+F键跳转JMP inputcontinue5:CMP AH,12hJNE continue6MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue6CALL EAlt ;按下ALT+E键跳转JMP inputcontinue6:CMP AH,13hJNE continue7MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue7CALL RAlt ;按下ALT+R键跳转JMP inputcontinue7:CMP AH,14hJNE continue8MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue8CALL TAlt ;按下ALT+T键跳转JMP inputcontinue8:CMP AH,10hJNE continue9MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue9CALL QAlt ;按下ALT+Q键跳转JMP inputcontinue9:CMP AH,48hJNE continue10CALL prsup ;按上键跳转JMP inputcontinue10:CMP AH,1chJNE inputCALL prsenter ;按下ENTER键跳转JMP input;----------------------------------------- exit PROC NEAR;退出子过程outputstr over,42,18,5,1ah;显示退出提示信息POS 21,0MOV AH,4chINT 21hRETexit ENDP;----------------------------------------- prsenter PROC NEAR ;按下ENTER键CMP subshow,0JNE enter1CALL prsdown ;子菜单未开启则开启子菜单RETenter1: ;第num号子菜单开启后的处理MOV AL, num ;主菜单号送ALPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALDEC numwritescr num,scrmm;对相应菜单写屏INC numpos 0, numPOP AXMOV num,ALdrawwindow 13h,22,4,22,50CMP num,1JNE prsenter1 ;不选择1号主菜单则跳转CMP subnum,2JNE entersub12outputstr sub11,10,22,5,13h;选择子菜单1entersub12:CMP subnum,3JNE entersub13outputstr sub12,11,22,5,13h;选择子菜单2entersub13:CMP subnum,4JNE prsenter1outputstr sub13,11,22,5,13h;选择子菜单3;CALL exitprsenter1:CMP num,2JNE prsenter2 ;不选择2号主菜单则跳转CMP subnum,2JNE entersub22outputstr sub21,10,22,5,13hentersub22:CMP subnum,3JNE entersub23outputstr sub22,11,22,5,13hentersub23:CMP subnum,4JNE prsenter2outputstr sub23,11,22,5,13hprsenter2:CMP num,3JNE prsenter3 ;不选择3号主菜单则跳转CMP subnum,2JNE entersub32outputstr sub31,10,22,5,13hentersub32:CMP subnum,3JNE entersub33outputstr sub32,12,22,5,13hentersub33:CMP subnum,4JNE prsenter3outputstr sub33,11,22,5,13hprsenter3:CMP num,4JNE prsenter4 ;不选择4号主菜单则跳转CMP subnum,2JNE entersub42outputstr sub41,11,22,5,13hentersub42:CMP subnum,3JNE entersub43outputstr sub42,11,22,5,13hentersub43:CMP subnum,4JNE prsenter4outputstr sub43,13,22,5,13hprsenter4:CMP num,5JNE prsenter5 ;不选择5号主菜单则跳转CMP subnum,2JNE entersub52outputstr sub51,12,22,5,13hentersub52:CMP subnum,3JNE entersub53outputstr sub52,10,22,5,13hentersub53:CMP subnum,4JNE prsenter5outputstr sub53,11,22,5,13hCALL exitprsenter5:MOV subshow,0 ;未选择主菜单,子菜单不显示RETprsenter ENDP;-----------------------------------------qalt PROC NEAR;QUIT下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,AL ;计算菜单位置CMP subshow,1JNE qshowDEC numwritescr num,scrmm ;对相应主菜单处写屏,恢复主菜单状态INC numqshow:readscr 42,scrmm ;读屏幕状态submenu 42,submenu51,5,submenu52,3,submenu53,4,9;显示子菜单changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,05hchangemenu 0,43,4,0fhchangemenu 2,44,6,0fhMOV subnum,2MOV subshow,1pos 0,43RETqalt ENDP;----------------------------------------- talt PROC NEAR;TOOL下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,ALCMP subshow,1JNE tshowDEC numwritescr num,scrmmINC numtshow:readscr 32,scrmmsubmenu 32,submenu41,4,submenu42,4,submenu43,6,9 changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,04hchangemenu 0,33,5,0fhchangemenu 2,34,6,0fhMOV subnum,2MOV subshow,1pos 0,33RETtalt ENDP;----------------------------------------- ralt PROC NEAR;RUN下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,ALCMP subshow,1JNE rshowDEC numwritescr num,scrmmINC numrshow:readscr 22,scrmmsubmenu 22,submenu31,3,submenu32,5,submenu33,4,9 changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,03hchangemenu 0,23,3,0fhchangemenu 2,24,6,0fhMOV subnum,2MOV subshow,1pos 0,23RETralt ENDP;----------------------------------------- ealt PROC NEAR;EDIT下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,ALCMP subshow,1JNE eshowDEC numwritescr num,scrmmINC numeshow:readscr 12,scrmmsubmenu 12,submenu21,3,submenu22,4,submenu23,4,9 changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,02hchangemenu 0,13,4,0fhchangemenu 2,14,6,0fhMOV subnum,2MOV subshow,1pos 0,13RETealt ENDP;----------------------------------------- falt PROC NEAR;FILE下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,ALCMP subshow,1JNE fshowDEC numwritescr num,scrmmINC numfshow:readscr 2,scrmmsubmenu 2,submenu11,3,submenu12,4,submenu13,4,9changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,01hchangemenu 0,3,4,0fhchangemenu 2,4,6,0fhMOV subnum,2MOV subshow,1pos 0,3RETfalt ENDP;----------------------------------------- prsup PROC NEAR; 按上箭头CMP subshow,0;子菜单号为0则不显示JNE prsup2RETprsup2:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu subnum, num,8,70h;恢复被选中子菜单的状态INC numchangemenu subnum, num,1,74h;恢复上一次被选中子菜单的属性POP AXMOV num,ALCMP subnum,02hJNE prsuptopMOV subnum,04h ;从顶部向上则回到底部JMP prsup1prsuptop:DEC subnum ;子菜单号减1prsup1:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu subnum, num,8,0fh;;反显子菜单POP AXMOV num,ALRETprsup ENDP;----------------------------------------- prsdown PROC NEAR; 按下箭头CMP subshow,0 ;子菜单未打开则打开相应的子菜单JNE prsdown2 ;子菜单已打开则跳转CMP num,1JNE prsdown3CALL falt ;打开FILE下的子菜单JMP prsdown7prsdown3:CMP num,2JNE prsdown4CALL ealt ;打开EDIT下的子菜单JMP prsdown7prsdown4:CMP num,3JNE prsdown5CALL ralt ;打开RUN下的子菜单JMP prsdown7prsdown5:CMP num,4JNE prsdown6CALL talt ;打开TOOL下的子菜单JMP prsdown7prsdown6:CALL qalt ;打开QUIT下的子菜单prsdown7:RETprsdown2:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu subnum, num,8,70h;恢复被选中子菜单的状态INC numchangemenu subnum, num,1,74h;恢复上一次被选中子菜单的属性POP AXMOV NUM,ALCMP subnum,04hJNE prsdownbotMOV subnum,02h ;从底部向下则回到顶部JMP prsdown1prsdownbot:INC subnum ;子菜单号加1prsdown1:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu subnum, num,8,0fh;反显子菜单POP AXMOV num,ALRETprsdown ENDP;----------------------------------------- prsright PROC NEAR ; 按右箭头CMP subshow,0JE prsright1CALL prsrgtsub ;子菜单已开启则跳转RETprsright1: ;子菜单未开启的处理MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu 0,num,5,70h;恢复当前选中主菜单的状态changemenu 0,num,1,74h;恢复状态POP AXMOV num,ALCMP num,05hJNE prsright2 ;未到达最右边则跳转MOV num,01h ;到达最右边则跳转最左边JMP prsright3prsright2:INC num ;主菜单号加1prsright3: ;置主菜单长度CMP num,1JE prsright4CMP num,2JE prsright4CMP num,5JE prsright4CMP num,3JE prsright5CMP num,4JE prsright4prsright4:MOV index,4JMP prsright7prsright5:MOV index,3prsright7:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu 0, num, index,0fh;反显主菜单POP AXMOV num,ALRETprsright ENDP;----------------------------------------- prsrgtsub PROC NEAR;当子菜单打开时按右箭头CMP num,1JNE prsrgt1CALL ealt ;打开EDIT的子菜单JMP prsrgt5prsrgt1:CMP num,2JNE prsrgt2CALL ralt ;打开RUN的子菜单JMP prsrgt5prsrgt2:CMP num,3JNE prsrgt3CALL talt ;打开TOOL的子菜单JMP prsrgt5prsrgt3:CMP num,4JNE prsrgt4CALL qalt ;打开QUIT的子菜单JMP prsrgt5prsrgt4:CALL falt ;打开FILE的子菜单prsrgt5:RETprsrgtsub ENDP;----------------------------------------- prsleft PROC NEAR;按左箭头CMP subshow,0JE prsleft1CALL prslftsubRETprsleft1:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu 0,num,5,70h ;恢复当前选中主菜单的状态changemenu 0,num,1,74h ;恢复状态POP AXMOV num,ALCMP num,01hJNE prsleft2MOV num,05hJMP prsleft3prsleft2:DEC num ;主菜单号减1prsleft3:CMP num,1JE prsleft4CMP num,2JE prsleft4CMP num,5JE prsleft4CMP num,3JE prsleft5CMP num,4JE prsleft4prsleft4:MOV index,4JMP prsleft7prsleft5:MOV index,3prsleft7:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu 0, num, index,0fh;反显主菜单POP AXMOV num,ALRETprsleft ENDP;----------------------------------------- prslftsub PROC NEAR;当子菜单打开时按左箭头CMP num,1JNE prslft1CALL qalt ;打开QUIT的子菜单JMP prslft5prslft1:CMP num,2JNE prslft2CALL falt ;打开FILE的子菜单JMP prslft5prslft2:CMP num,3JNE prslft3CALL ealt ;打开EDIT的子菜单JMP prslft5prslft3:CMP num,4JNE prslft4CALL ralt ;打开RUN的子菜单JMP prslft5prslft4:CALL talt ;打开TOOL的子菜单prslft5:RETprslftsub ENDP;-----------------------------------------CODES ENDSEND START。
汇编语言菜单系统
汇编语⾔菜单系统实训⼀光标漫游⒈问题在25⾏80列的显⽰屏内,通过按键“→、←、↑、↓”来改变光标的位置,如按“→”键则光标往右侧⾛⼀列,按“↑”键则光标往上⾛⼀⾏的位置,最终通过“Esc”结束程序。
⒉边界问题要处理好特殊情况:①光标在第⼀⾏,再按“↑”键时;②光标在第⼀列,再按“←”键时;③光标在第25⾏,再按“↓”键时;④光标在第80列,再按“→”键时。
⒊边界问题处理采⽤折返的⽅式:①光标在第1⾏,再按“↑”键时进到第25⾏;②光标在第1列,再按“←”键时进到第80⾏;③光标在第25⾏,再按“↓”键时进到第1⾏;④光标在第80列,再按“→”键时时进到第1列。
⒋实验基础①读键:⽤int 16h的0号功能调⽤掌握扫描码和字符码的区别Mov ah,0Int 16h;返回AH=扫描码,AL=字符码②定位光标:⽤int 10h的2号③清屏:⽤int 10h的6号(或7号)功能调⽤MOV AH,6MOV BH,04hMOV AL,0MOV CX,0MOV DX,184fhINT 10h④相关键的扫描码和字符码EnterKey EQU 1c0dhEscKey EQU 010bhUpCursor EQU 4800hLeftCursor EQU 4b00hRightCursor EQU 4d00hDownCursor EQU 5000h5.算法do{定位光标读键if (al==特殊键){if (ah==左光标键)修正列值}else if (ah==右光标键){修正列值}else if (ah==上光标键){修正⾏值}else if (ah==下光标键){修正⾏值}}}while (al!=Esc)6.实验步骤运⾏“光标漫游⽰例.EXE”了解需求。
①编⼀⼩程序获得特殊键“→、←、↑、↓”“Esc、回车”等的扫描码和Asc码值,并记录以备后⽤;②写出光标漫游的算法(保存,⽤类⾃然语⾔描述,⽤word,与同学、⽼师讨论算法的可⾏性与正确性);③在②初步正确的基础上,编写汇编语⾔源程序;④如发现算法问题,⽤调试器调试;7.要点光标如何根据所按的键跟随?折返如何处理?x=(x+1) %25;8.该实验与⼤实验的关联性请⼤家体会主菜单“实验蓝本.exe”的处理过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DATAS SEGMENTscrmm DB 100 DUP(?);主菜单名menu1 DB'FILE'menu2 DB'Edit'menu3 DB'RUN'menu4 DB'TOOL'menu5 DB'QUIT';主菜单File下子菜单名submenu11 DB'New'submenu12 DB'Open'submenu13 DB'Save';主菜单Edit下子菜单名submenu21 DB'Cut'submenu22 DB'Past'submenu23 DB'Copy';主菜单Run下子菜单名submenu31 DB'Run'submenu32 DB'Go to'submenu33 DB'Step';主菜单Debug下子菜单名submenu41 DB'Call'submenu42 DB'Find'submenu43 DB'Source';主菜单Help下子菜单名submenu51 DB'About'submenu52 DB'Web'submenu53 DB'Exit';窗口信息msg1 DB'Please press Alt+F,Alt+E,Alt+R,Alt+T,Alt+Q or ',19h,' to open the submenu.'msg2 DB'Please press Enter (',11h,0c4h,0d9h,') to open/close the submenu.' msg3 DB'Please press ',1bh,' or ',1ah,' to select the menu.'msg4 DB'Please press ',18h,' or ',19h,' to select the submenu.';msg7 DB ' ';退出信息'over DB'Thank you for uesing,author by Jianhua';其他信息escape DB'Press ESC to exit.'text1 DB'This is a menu program made with assemble.' sub11 DB'Select New'sub12 DB'Select Open'sub13 DB'Select Save'sub21 DB'Select Cut'sub22 DB'Select Past'sub23 DB'Select Copy'sub31 DB'Select Run'sub32 DB'Select Go to'sub33 DB'Select Step'sub41 DB'Select Call'sub42 DB'Select Find'sub43 DB'Select Source'sub51 DB'Select About'sub52 DB'Select Web'sub53 DB'Select Exit';-------------------------num DB 1 ;主菜单序列号subnum DB?;子菜单序列号subshow DB 0 ;为0时子菜单未显示index DB?;主菜单长度;--------------------------------DATAS ENDS;设置光标位置,显示在0页的(top,left)位置pos MACRO top,leftMOV AH,02hMOV BH,0 ;页号MOV DH,topMOV DL,left ;位置INT 10hENDM;修改菜单属性changemenu MACRO top,left,WIDTH,attrLOCAL chgMOV DL,leftchg:pos top,DL ;置光标位置MOV BH,0 ;页号MOV AH,08h ;读光标位置的属性,AH=属性,AL=字符INT 10hMOV BL,attr ;设置属性MOV CX,1 ;字符重复次数MOV AH,09h ;在光标位置显示字符及设置其属性INT 10hINC DLMOV DH,leftADD DH,WIDTHCMP DL,DH ;设置的循环次数控制JNE chgpos top,leftENDM;绘制窗口drawwindow MACRO attr,top,left,bottom,rightPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,06h ;屏幕初始化MOV AL,0 ;全屏为空白MOV BH,attr ;卷入行属性MOV CH,topMOV CL,left ;左上角坐标MOV DH,bottomMOV DL,right;右下角坐标INT 10hPOP DXPOP CXPOP BXPOP AXENDM;绘制窗口上下边框windowtandb MACRO l,m,r,top,left,WIDTH,attrpos top,left ;置光标位置outputchar l,attr,1 ;输出字符,画左上折角pos top,left+1 ;置光标位置outputchar m,attr,WIDTH-2;输出字符,画上边框pos top,left+WIDTH-1 ;置光标位置outputchar r,attr,1 ;输出字符,画右上折角ENDM;绘制窗口左右边框windowlandr MACRO char,top,left,WIDTH,attr pos top,left ;置光标位置outputchar char,attr,1 ;输出字符,画左边框pos top,left+WIDTH-1 ;置光标位置outputchar char,attr,1 ;输出字符,画右边框ENDM;输出outputchar MACRO char,attr,numPUSH AXMOV BH,0 ;页号MOV AH,09hMOV AL,char ;字符MOV BL,attr ;属性MOV CX,num ;重复次数INT 10hPOP AXENDM;输出串outputstr MACRO str,num,top,left,attrPUSH AXPUSH BXPUSH BPPUSH CXPUSH DXMOV AH,13hLEA BP,str ;字串地址送ES:BPMOV CX,num ;长度MOV DH,topMOV DL,left ;位置坐标MOV BH,0 ;页号MOV AL,0 ;写方式MOV BL,attr ;属性INT 10hPOP DXPOP CXPOP BPPOP BXPOP AXENDM;绘制子菜单submenu MACRO left,menu1,num1,menu2,num2,menu3,num3,WIDTH LOCAL menudrawwindow 70h,1,left,5,left+WIDTH ;画子菜单窗口windowtandb 0dah,0c4h,0bfh,1,left,WIDTH+1,70h ;画子菜单上边筐MOV AL,2menu:windowlandr 0b3h,AL,left,WIDTH+1,70h ;画子菜单左右边筐INC ALCMP AL,5JNE menuwindowtandb 0c0h,0c4h,0d9h,5,left,WIDTH+1,70h ;画子菜单下边筐outputstr menu1,num1,2,left+2,0fh ;(2,left+2)显示子菜单1changemenu 2,left+1,8,0fhoutputstr menu2,num2,3,left+2,70h ;(3,left+2)显示子菜单2 changemenu 3,left+2,1,74houtputstr menu3,num3,4,left+2,70h ;(4,left+2)显示子菜单3 changemenu 4,left+2,1,74hENDM;读取屏幕内容readscr MACRO left,memoryLOCAL readSUB AX,AXMOV SI,AXread:ADD AH,leftINC ALINC SIMOV CH,AHpos AL,CH ;置光标位置MOV AH,08h ;读光标位置字符和属性,AH=字符,AL=属性MOV BH,0 ;页号INT 10hMOV memory[SI],AL ;属性保存MOV memory[SI+50],AH;字符保存MOV AX,SIMOV BL,10DIV BLCMP SI,50JNE readENDM;写入屏幕writescr MACRO left,memoryLOCAL writeSUB AX,AXMOV SI,AXwrite:ADD AH,leftINC ALINC SIMOV CH,AHpos AL,CH ;置光标位置MOV AL,memory[SI] ;属性送ALMOV AH,memory[SI+50];字符送AHMOV DL,ALMOV DH,AHoutputchar DL,DH,1 ;输出MOV AX,SIMOV BL,10DIV BLCMP SI,50JNE writeENDM;设置光标属性showcur MACRO showPUSH AXPUSH CXMOV AH,1MOV CH,show ;光标起始行设置MOV CL,0 ;光标结束行设置INT 10hPOP CXPOP AXENDMSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV ES,AX;窗口预置drawwindow 1eh,0,0,24,79 ;画主窗口drawwindow 70h,0,0,0,79 ;画菜单窗口drawwindow 70h,24,0,24,79 ;画副窗口;画主窗口上边框windowtandb 0d5h,0cdh,0b8h,1,0,80,1ehMOV AL,2draw:;画主窗口左右边框windowlandr 0b3h,AL,0,80,1ehINC ALCMP AL,17hJNE draw;画主窗口下边框windowtandb 0c0h,0c4h,0d9h,23,0,80,1eh;***************************************开始主菜单绘制outputstr menu1,4,0,3,0Fh ;输出(串,长度,位置,属性)outputstr menu2,4,0,13,70hchangemenu 0,13,1,74houtputstr menu3,3,0,23,70hchangemenu 0,23,1,74houtputstr menu4,4,0,33,70hchangemenu 0,33,1,74houtputstr menu5,4,0,43,70hchangemenu 0,43,1,74h;***************************************结束主菜单绘制;***************************************窗口提示信息输出outputstr msg1,68,3,5,17h;输出(串,长度,位置,属性)changemenu 3,18,5,1eh ;改变属性(起始位置,重复次数,属性)changemenu 3,24,5,1ehchangemenu 3,30,5,1ehchangemenu 3,36,5,1ehchangemenu 3,42,5,1ehchangemenu 3,51,1,1ehoutputstr msg2,51,6,5,17hchangemenu 6,18,11,1ehoutputstr msg3,40,9,5,17hchangemenu 9,18,1,1ehchangemenu 9,23,1,1ehoutputstr msg4,42,12,5,17hchangemenu 12,18,1,1ehchangemenu 12,23,1,1ehoutputstr escape,18,15,5,17hchangemenu 15,11,3,1ehpos 24,0INPUT: ;消息接收循环MOV AH,0INT 16hCMP AH,01h ;ESC退出JNE continue1 ;否则继续CALL exitcontinue1:CMP AH,4bhJNE continue2CALL prsleft ;按左键跳转JMP inputcontinue2:CMP AH,4dhJNE continue3CALL prsright ;按右键跳转JMP inputcontinue3:CMP AH,50hJNE continue4CALL prsdown ;按下键跳转JMP inputcontinue4:CMP AH,21hJNE continue5MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue5CALL FAlt ;按下ALT+F键跳转JMP inputcontinue5:CMP AH,12hJNE continue6MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue6CALL EAlt ;按下ALT+E键跳转JMP inputcontinue6:CMP AH,13hJNE continue7MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue7CALL RAlt ;按下ALT+R键跳转JMP inputcontinue7:CMP AH,14hJNE continue8MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue8CALL TAlt ;按下ALT+T键跳转JMP inputcontinue8:CMP AH,10hJNE continue9MOV AH,02hINT 16hAND AL,0fhCMP AL,08hJNE continue9CALL QAlt ;按下ALT+Q键跳转JMP inputcontinue9:CMP AH,48hJNE continue10CALL prsup ;按上键跳转JMP inputcontinue10:CMP AH,1chJNE inputCALL prsenter ;按下ENTER键跳转JMP input;----------------------------------------- exit PROC NEAR;退出子过程outputstr over,42,18,5,1ah;显示退出提示信息POS 21,0MOV AH,4chINT 21hRETexit ENDP;----------------------------------------- prsenter PROC NEAR ;按下ENTER键CMP subshow,0JNE enter1CALL prsdown ;子菜单未开启则开启子菜单RETenter1: ;第num号子菜单开启后的处理MOV AL, num ;主菜单号送ALPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALDEC numwritescr num,scrmm;对相应菜单写屏INC numpos 0, numPOP AXMOV num,ALdrawwindow 13h,22,4,22,50CMP num,1JNE prsenter1 ;不选择1号主菜单则跳转CMP subnum,2JNE entersub12outputstr sub11,10,22,5,13h;选择子菜单1entersub12:CMP subnum,3JNE entersub13outputstr sub12,11,22,5,13h;选择子菜单2entersub13:CMP subnum,4JNE prsenter1outputstr sub13,11,22,5,13h;选择子菜单3;CALL exitprsenter1:CMP num,2JNE prsenter2 ;不选择2号主菜单则跳转CMP subnum,2JNE entersub22outputstr sub21,10,22,5,13hentersub22:CMP subnum,3JNE entersub23outputstr sub22,11,22,5,13hentersub23:CMP subnum,4JNE prsenter2outputstr sub23,11,22,5,13hprsenter2:CMP num,3JNE prsenter3 ;不选择3号主菜单则跳转CMP subnum,2JNE entersub32outputstr sub31,10,22,5,13hentersub32:CMP subnum,3JNE entersub33outputstr sub32,12,22,5,13hentersub33:CMP subnum,4JNE prsenter3outputstr sub33,11,22,5,13hprsenter3:CMP num,4JNE prsenter4 ;不选择4号主菜单则跳转CMP subnum,2JNE entersub42outputstr sub41,11,22,5,13hentersub42:CMP subnum,3JNE entersub43outputstr sub42,11,22,5,13hentersub43:CMP subnum,4JNE prsenter4outputstr sub43,13,22,5,13hprsenter4:CMP num,5JNE prsenter5 ;不选择5号主菜单则跳转CMP subnum,2JNE entersub52outputstr sub51,12,22,5,13hentersub52:CMP subnum,3JNE entersub53outputstr sub52,10,22,5,13hentersub53:CMP subnum,4JNE prsenter5outputstr sub53,11,22,5,13hCALL exitprsenter5:MOV subshow,0 ;未选择主菜单,子菜单不显示RETprsenter ENDP;-----------------------------------------qalt PROC NEAR;QUIT下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,AL ;计算菜单位置CMP subshow,1JNE qshowDEC numwritescr num,scrmm ;对相应主菜单处写屏,恢复主菜单状态INC numqshow:readscr 42,scrmm ;读屏幕状态submenu 42,submenu51,5,submenu52,3,submenu53,4,9;显示子菜单changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,05hchangemenu 0,43,4,0fhchangemenu 2,44,6,0fhMOV subnum,2MOV subshow,1pos 0,43RETqalt ENDP;----------------------------------------- talt PROC NEAR;TOOL下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,ALCMP subshow,1JNE tshowDEC numwritescr num,scrmmINC numtshow:readscr 32,scrmmsubmenu 32,submenu41,4,submenu42,4,submenu43,6,9 changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,04hchangemenu 0,33,5,0fhchangemenu 2,34,6,0fhMOV subnum,2MOV subshow,1pos 0,33RETtalt ENDP;----------------------------------------- ralt PROC NEAR;RUN下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,ALCMP subshow,1JNE rshowDEC numwritescr num,scrmmINC numrshow:readscr 22,scrmmsubmenu 22,submenu31,3,submenu32,5,submenu33,4,9 changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,03hchangemenu 0,23,3,0fhchangemenu 2,24,6,0fhMOV subnum,2MOV subshow,1pos 0,23RETralt ENDP;----------------------------------------- ealt PROC NEAR;EDIT下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,ALCMP subshow,1JNE eshowDEC numwritescr num,scrmmINC numeshow:readscr 12,scrmmsubmenu 12,submenu21,3,submenu22,4,submenu23,4,9 changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,02hchangemenu 0,13,4,0fhchangemenu 2,14,6,0fhMOV subnum,2MOV subshow,1pos 0,13RETealt ENDP;----------------------------------------- falt PROC NEAR;FILE下的子菜单显示MOV AL, numMOV CL,0ahMUL CLSUB AX,07hMOV num,ALCMP subshow,1JNE fshowDEC numwritescr num,scrmmINC numfshow:readscr 2,scrmmsubmenu 2,submenu11,3,submenu12,4,submenu13,4,9changemenu 0, num,5,70hchangemenu 0, num,1,74hMOV num,01hchangemenu 0,3,4,0fhchangemenu 2,4,6,0fhMOV subnum,2MOV subshow,1pos 0,3RETfalt ENDP;----------------------------------------- prsup PROC NEAR; 按上箭头CMP subshow,0;子菜单号为0则不显示JNE prsup2RETprsup2:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu subnum, num,8,70h;恢复被选中子菜单的状态INC numchangemenu subnum, num,1,74h;恢复上一次被选中子菜单的属性POP AXMOV num,ALCMP subnum,02hJNE prsuptopMOV subnum,04h ;从顶部向上则回到底部JMP prsup1prsuptop:DEC subnum ;子菜单号减1prsup1:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu subnum, num,8,0fh;;反显子菜单POP AXMOV num,ALRETprsup ENDP;----------------------------------------- prsdown PROC NEAR; 按下箭头CMP subshow,0 ;子菜单未打开则打开相应的子菜单JNE prsdown2 ;子菜单已打开则跳转CMP num,1JNE prsdown3CALL falt ;打开FILE下的子菜单JMP prsdown7prsdown3:CMP num,2JNE prsdown4CALL ealt ;打开EDIT下的子菜单JMP prsdown7prsdown4:CMP num,3JNE prsdown5CALL ralt ;打开RUN下的子菜单JMP prsdown7prsdown5:CMP num,4JNE prsdown6CALL talt ;打开TOOL下的子菜单JMP prsdown7prsdown6:CALL qalt ;打开QUIT下的子菜单prsdown7:RETprsdown2:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu subnum, num,8,70h;恢复被选中子菜单的状态INC numchangemenu subnum, num,1,74h;恢复上一次被选中子菜单的属性POP AXMOV NUM,ALCMP subnum,04hJNE prsdownbotMOV subnum,02h ;从底部向下则回到顶部JMP prsdown1prsdownbot:INC subnum ;子菜单号加1prsdown1:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu subnum, num,8,0fh;反显子菜单POP AXMOV num,ALRETprsdown ENDP;----------------------------------------- prsright PROC NEAR ; 按右箭头CMP subshow,0JE prsright1CALL prsrgtsub ;子菜单已开启则跳转RETprsright1: ;子菜单未开启的处理MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu 0,num,5,70h;恢复当前选中主菜单的状态changemenu 0,num,1,74h;恢复状态POP AXMOV num,ALCMP num,05hJNE prsright2 ;未到达最右边则跳转MOV num,01h ;到达最右边则跳转最左边JMP prsright3prsright2:INC num ;主菜单号加1prsright3: ;置主菜单长度CMP num,1JE prsright4CMP num,2JE prsright4CMP num,5JE prsright4CMP num,3JE prsright5CMP num,4JE prsright4prsright4:MOV index,4JMP prsright7prsright5:MOV index,3prsright7:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu 0, num, index,0fh;反显主菜单POP AXMOV num,ALRETprsright ENDP;----------------------------------------- prsrgtsub PROC NEAR;当子菜单打开时按右箭头CMP num,1JNE prsrgt1CALL ealt ;打开EDIT的子菜单JMP prsrgt5prsrgt1:CMP num,2JNE prsrgt2CALL ralt ;打开RUN的子菜单JMP prsrgt5prsrgt2:CMP num,3JNE prsrgt3CALL talt ;打开TOOL的子菜单JMP prsrgt5prsrgt3:CMP num,4JNE prsrgt4CALL qalt ;打开QUIT的子菜单JMP prsrgt5prsrgt4:CALL falt ;打开FILE的子菜单prsrgt5:RETprsrgtsub ENDP;----------------------------------------- prsleft PROC NEAR;按左箭头CMP subshow,0JE prsleft1CALL prslftsubRETprsleft1:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu 0,num,5,70h ;恢复当前选中主菜单的状态changemenu 0,num,1,74h ;恢复状态POP AXMOV num,ALCMP num,01hJNE prsleft2MOV num,05hJMP prsleft3prsleft2:DEC num ;主菜单号减1prsleft3:CMP num,1JE prsleft4CMP num,2JE prsleft4CMP num,5JE prsleft4CMP num,3JE prsleft5CMP num,4JE prsleft4prsleft4:MOV index,4JMP prsleft7prsleft5:MOV index,3prsleft7:MOV AL, numPUSH AXMOV CL,0ahMUL CLSUB AX,07hMOV num,ALchangemenu 0, num, index,0fh;反显主菜单POP AXMOV num,ALRETprsleft ENDP;----------------------------------------- prslftsub PROC NEAR;当子菜单打开时按左箭头CMP num,1JNE prslft1CALL qalt ;打开QUIT的子菜单JMP prslft5prslft1:CMP num,2JNE prslft2CALL falt ;打开FILE的子菜单JMP prslft5prslft2:CMP num,3JNE prslft3CALL ealt ;打开EDIT的子菜单JMP prslft5prslft3:CMP num,4JNE prslft4CALL ralt ;打开RUN的子菜单JMP prslft5prslft4:CALL talt ;打开TOOL的子菜单prslft5:RETprslftsub ENDP;-----------------------------------------CODES ENDSEND START。