预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

1 《汇编语言程序设计》 实验报告 2 实验四完整段定义程序的实现 实验目的 1、掌握完整段格式定义的程序设计方法; 2、掌握伪指令:SEGMENT、ENDS、ASSUME、END、OFFSET、DUP; 3、掌握汇编语言程序中指名程序入口的方法; 4、了解用INT21H的4C号功能调用返回系统的方法; 5、掌握用MASM、LINK工具进行汇编和链接的过程。 实验内容 要求程序中实现对键盘输入的字符作如下处理: 如果输入的是小写字母则转换成对应的大写字母并显示在屏幕上; 如果输入的是大写字母则转换成对应的小写字母并显示在屏幕上; 如果输入的是键盘上的Esc键则退出程序执行; 按其它任意可显示键,则不作处理,直接显示输出。 实验步骤 1、编辑下列程序: DATASEGMENT;数据段定义 MESSAGEDB'Pleaseinputyourkey!',0DH,0AH,'$' DATAENDS STACKSEGMENTPARASTACK'STACK'堆栈段定义; DB50DUP(?) STACKENDS CODESEGMENT;代码段 ASSUMECS:CODE,DS:DATA,SS:STACK;分配段寄存器 START:MOVAX,DATA MOVDS,AX MOVDX,OFFSETMESSAGE MOVAH,9 INT21H;显示提示信息 AGAIN:MOVAH,1 INT21H;读入一个键盘按键 CMPAL,1BH;按的是ESC键(ASCII码为1BH)则退出程序 JEEXIT CMPAL,61H JBNEXT CMPAL,7AH 3 JANEXT SUBAL,20H;ASCII码在61H和7AH之间(小写字母)则转换为大写字母 JMPDISP NEXT:CMPAL,41H JBDISP CMPAL,5AH JADISP ADDAL,20H;ASCII码在41H和5AH之间(大写字母)则转换为小写字母 DISP:MOVDL,AL MOVAH,2 INT21H;显示当前字符 JMPAGAIN;循环 EXIT:MOVAH,4CH;结束程序 INT21H CODEENDS ENDSTART;指定START标号为程序入口地址 4 图4-1键入代码 2、把上述程序保存为ASM源文件,利用MASM根据对源文件进行汇编,产生.OBJ文件, 若汇编时提示有错,编辑工具修改源程序后重新汇编,直至通过。 图4-2汇编成功 图4-3程序运行成功 图4-4DOS命令下汇编.asm文件 3、用LINK将.OBJ文件连接成可执行的.EXE文件。 图4-5-1DOS命令下汇编连接生成.exe文件 5 图4-5-2DIR目录查看生成的.exe文件及其大小 4、在DOS状态下运行LINK产生的.EXE文件,按过键盘之后在屏幕上显示实验要求的字 符,按ESC键可返回DOS。 图4-6DOS命令下运行.exe程序 5.把上述程序改为简化段定义格式,再汇编,查看执行结果。 6 图4-7简化段定义代码设计 图4-8汇编成功 图4-9运行成功 实验体会 1.段定义的一般格式如下: 段名SEGMENT[对齐类型][组合类型][类别] …… 段名ENDS 段属性“对齐类型”、“组合类型”和“类别”要按此顺序说明,但这些可选项可根据需要 选择书写。如果源程序中不指定某个属性,那么,汇编程序将使用该属性的缺省值。 2.在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。 建立这种对应关系的说明语句格式如下: ASSUME段寄存器名:段名[,段寄存器名:段名,……] 其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。 在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系要用逗号 分隔。例如, ASSUMECS:CODE1,DS:DATA1 7 上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。 在ASSUME语句中,还可以用关键字NOTHING来说明某个段寄存器不与任何段相对 应。下面语句说明了段寄存器ES不与某段相对应。 ASSUMEES:NOTHING 3.伪指令END表示源程序到此为止,汇编程序对该语句之后的任何内容都不作处理,所以, 通常情况下,伪指令END是源程序的最后一条语句。伪指令END后面可附带一个在程序 中已定义的标号,由该标号指明程序的启动位置。如果源程序是一个独立的程序或主模块, 那么,伪指令END后面一定要附带一个标号;如果源程序仅是一个普通模块,那么,其END 后面