汇编程序设计实验报告--完整段定义程序实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《汇编语言程序设计》
实验报告
实验四完整段定义程序的实现实验目的
1、掌握完整段格式定义的程序设计方法;
2、掌握伪指令:SEGMENT、ENDS、ASSUME、END、OFFSET、DUP;
3、掌握汇编语言程序中指名程序入口的方法;
4、了解用INT 21H 的4C号功能调用返回系统的方法;
5、掌握用MASM、LINK工具进行汇编和链接的过程。
实验内容
要求程序中实现对键盘输入的字符作如下处理:
●如果输入的是小写字母则转换成对应的大写字母并显示在屏幕上;
●如果输入的是大写字母则转换成对应的小写字母并显示在屏幕上;
●如果输入的是键盘上的Esc键则退出程序执行;
●按其它任意可显示键,则不作处理,直接显示输出。
实验步骤
1、编辑下列程序:
DATA SEGMENT ;数据段定义
MESSAGE DB 'Please input your key!',0DH,0AH,'$' DATA ENDS
STACK SEGMENT PARA STACK 'STACK' ;堆栈段定义
DB 50 DUP(?)
STACK ENDS
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA,SS:STACK ;分配段寄存器START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MESSAGE
MOV AH,9
INT 21H ;显示提示信息
AGAIN: MOV AH,1
INT 21H ;读入一个键盘按键
CMP AL,1BH ;按的是ESC键(ASCII码为1BH)则退出程序
JE EXIT
CMP AL,61H
JB NEXT
CMP AL,7AH
JA NEXT
SUB AL,20H ;ASCII码在61H和7AH之间(小写字母)则转换为大写字母
JMP DISP
NEXT: CMP AL,41H
JB DISP
CMP AL,5AH
JA DISP
ADD AL,20H ;ASCII码在41H和5AH之间(大写字母)则转换为小写字母DISP: MOV DL,AL
MOV AH,2
INT 21H ;显示当前字符
JMP AGAIN ;循环
EXIT: MOV AH,4CH ;结束程序
INT 21H
CODE ENDS
END START ;指定START标号为程序入口地址
图 4-1 键入代码
2、把上述程序保存为ASM源文件,利用MASM根据对源文件进行汇编,产生.OBJ文件,若汇编时提示有错,编辑工具修改源程序后重新汇编,直至通过。
图 4-2 汇编成功
图 4-3 程序运行成功
图 4-4DOS命令下汇编.asm文件
3、用LINK将.OBJ文件连接成可执行的.EXE文件。
图 4-5-1 DOS命令下汇编连接生成.exe文件
图 4-5-2 DIR目录查看生成的.exe文件及其大小
4、在DOS状态下运行LINK产生的.EXE文件,按过键盘之后在屏幕上显示实验要求的字符,按ESC键可返回DOS。
图 4-6 DOS命令下运行.exe程序
5.把上述程序改为简化段定义格式,再汇编,查看执行结果。
图 4-7 简化段定义代码设计
图 4-8 汇编成功
图 4-9 运行成功
实验体会
1.段定义的一般格式如下:
段名SEGMENT [对齐类型] [组合类型] [类别]
……
段名ENDS
段属性“对齐类型”、“组合类型”和“类别”要按此顺序说明,但这些可选项可根据需要选择书写。如果源程序中不指定某个属性,那么,汇编程序将使用该属性的缺省值。
2.在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式如下:
ASSUME 段寄存器名:段名[, 段寄存器名:段名, ……]
其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。
在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系要用逗号分隔。例如,
ASSUME CS:CODE1, DS:DA TA1
上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DA TA1。
在ASSUME语句中,还可以用关键字NOTHING来说明某个段寄存器不与任何段相对应。下面语句说明了段寄存器ES不与某段相对应。
ASSUME ES:NOTHING
3.伪指令END表示源程序到此为止,汇编程序对该语句之后的任何内容都不作处理,所以,通常情况下,伪指令END是源程序的最后一条语句。伪指令END后面可附带一个在程序中已定义的标号,由该标号指明程序的启动位置。如果源程序是一个独立的程序或主模块,那么,伪指令END后面一定要附带一个标号;如果源程序仅是一个普通模块,那么,其END 后面就一定不能附带标号;
4.MOV AX ,@DATA ;取数据段段值
5. 偏移量属性操作符(OFFSET)返回该标识符离它所在段的段地址有多少字节。一般情况,我们只会取内存变量的偏移量,而不太关心标号的偏移量。
6.小模式下简化段定义的缺省属性表