汇编 菜单程序设计

合集下载

汇编语言程序设计综合设计实验项目

汇编语言程序设计综合设计实验项目

汇编语言程序设计创新实验项目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章 汇编语言程序设计

第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汇编语言程序设计

8086汇编语言程序设计
(1)汇编语言介绍
汇编语言(简称汇编)是一种低级语言,它能够与计算机硬件的指令
指令很好地接轨,是一种可靠的,有效的,灵活的编程语言。

主要用于编
写微型机,微处理器,单片机及PC机的程序。

汇编器是汇编语言的翻译器,它将高级语言(如C、C++等)翻译为机器语言指令,以达到执行程
序源代码的目的。

汇编语言程序设计(Assembly Language Programming)是以汇编语
言编写程序以满足特定应用的过程。

它主要用于写微机、微处理器等的控
制程序和系统程序,具有立即计算,快速反应,低耗能,成本低廉的优点。

(2)汇编语言编程
汇编语言编程主要是为了让CPU以机器语言运行,编程时可使用指令
集合或者标准指令。

根据指令可以让CPU执行计算机的功能,原理上看,
汇编语言编程是一种字节操作。

汇编程序编程需要使用CPU的指令集,这些指令可以被用来控制CPU
执行。

指令集又可分为实指令集和抽象指令集。

对于不同的CPU,他们的
指令集也是不一样的,因此需要根据CPU的不同选择合适的指令集。

在汇编语言编程中,常见的指令有加法,减法,乘法,除法,移位,
现行,条件转移等等。

汇编语言程序设计步骤

汇编语言程序设计步骤

汇编语言程序设计步骤一、引言汇编语言是一种底层的计算机语言,用于编写机器指令,控制计算机硬件。

它是一种直接操作计算机硬件的语言,因此在编写汇编语言程序时需要遵循一系列步骤,以确保程序的正确性和高效性。

二、程序设计步骤1. 确定程序的目标和需求:在编写汇编语言程序之前,我们首先需要明确程序的目标和需求。

这包括程序要实现的功能、输入和输出的格式等。

2. 设计程序的算法:根据程序的目标和需求,我们需要设计程序的算法。

算法是程序的核心,它描述了解决问题的步骤和方法。

在设计算法时,我们需要考虑程序的效率和可读性。

3. 编写程序的伪代码:在正式编写汇编语言程序之前,我们可以先编写程序的伪代码。

伪代码是一种类似自然语言的描述,用于描述程序的逻辑结构和算法。

编写伪代码可以帮助我们更清晰地理解程序的逻辑。

4. 编写汇编语言程序:在编写汇编语言程序时,我们需要根据程序的伪代码,使用汇编语言的指令和语法,逐步实现程序的功能。

编写程序时,需要注意变量的定义、指令的顺序和循环结构的使用等。

5. 进行程序的测试和调试:编写完汇编语言程序后,我们需要进行测试和调试。

通过输入不同的数据,检查程序的输出是否符合预期。

如果程序出现错误或bug,我们需要通过调试,找出错误的原因并进行修复。

6. 优化程序的性能:为了提高程序的执行效率,我们可以对程序进行优化。

优化的方法包括改进算法、减少指令的使用和优化内存的访问等。

通过优化程序,可以使程序更快速地运行。

7. 文档化和维护程序:编写完汇编语言程序后,我们需要撰写程序的文档,包括程序的功能、输入和输出的格式、程序的使用方法等。

同时,还需要对程序进行维护,及时修复bug和添加新的功能。

三、总结汇编语言程序设计是一项复杂而重要的任务。

通过遵循上述步骤,我们可以编写出高质量、高效率的汇编语言程序。

同时,编写汇编语言程序也需要耐心和细心,不断学习和积累经验,以提升自己的编程能力。

通过不断的实践和学习,我们可以成为一名优秀的汇编语言程序员。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档