汇编程序设计实验报告--完整段定义程序实现

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

相关文档
最新文档