学 院:计算机科学与技术
专 业:计算机科学与技术
指导教师: **
班 级: **
学 号: **
姓 名: **
实验一 集成环境及调试工具
一、实验题目
认识Tddebug集成操作软件
二、分析设计思想,绘制实验原理图、流程图
(一)、汇编语言程序的开发过程如图1.1所示,这个过程主要有编辑、编译、链接几个步骤构成。
1、源程序的编辑
E: > EDIT TEST.ASM
编辑过程就是将源程序输入内存,生成一个扩展名为ASM的文本文件并存入硬盘。
2、源程序的编译
E:>TASM TEST.ASM
编译也称为汇编,就是利用汇编器(如TASM或MASM)对源程序进行编译,生成扩展名为OBJ的目标文件。在编译过程中,检查语法错误,若有错,则不生成目标代码文件,并给出错误信息。根据错误信息应返回到编辑状态,修改源程序。
3、目标程序的链接
E:> TLINK TEST.OBJ
链接过程是利用链接程序(如TLINK或LINK)将用户目标程序和库文件链接、定位,生成扩展名为EXE的可执行文件。链接时,如果链接文件找不到所需要的链接信息,则发出错误信息,不生成可执行文件。
4、调试可执行程序
E:>TD TEST.EXE
如果生成的EXE文件运行后,并没有按照设计意图运行,就需要对程序进行调试,找出错误。再对源程序进行修改,即重复进行编辑、编译、链接、调试,直到生成完全正确的可执行文件为止。
(二)、Tddebug集成操作软件使用说明
1.该软件是集编辑(Edit.exe)、编译(Tasm.exe)、连接(Link.exe)和调试(TD.exe)等多个功能于一体,可在DOS环境下运行,为用户提供了一个学习微机原理的实验平台。
2.启动Tddebug D:\wjyl> Tddebug
若启动成功,进入主界面。
3.Tddebug的菜单结构
主菜单 子菜单 菜单说明
Edit 编辑源文件(.asm)
Compile —— Compile 编译源文件(.asm)
—— Link 连接目标文件(.obj)
—— Build All 编译和连接
Pmrun 进入保护模式调试状态
Rmrun —— Run 运行实模式程序(.exe)
—— Debug 进入实模式调试状态(.exe)
Help 版本信息
Quit 退出Tddebug
4.菜单选择
(1)快捷键选择主菜单:ALT+热键(E,C,P,R,H,Q)
(2)按左右键或直接使用快捷键在主菜单之间切换。使用上下键可选择子菜单中的菜单项。
5.执行菜单项
选中要执行的菜单项,键入Enter键,系统弹出对话框,输入需操作的文件名,以Enter键结尾,取消操作按Esc键。
6.实模式调试窗口说明
(1)键入Alt+R选择Rmrun主菜单的Debug子菜单弹出实模式调试窗口。 此时可能会叠加一个报告无符号表的对话框,按Esc键关闭该对话框。
(2)该窗口实际是Turbo Debugger调试器窗口,简称TD。其窗口的划分如图1-1所示。
主菜单条 | ||
代码显示调试区 | 寄存器显示调试区 | 标志寄存器显示调试区 |
内存数据显示调试区 | 堆栈显示调试区 | |
快捷键操作提示区 |
(3)主菜单中包含了File、Edit、View、Run、Breakpoints、Data、Options、Windows和Help共9个菜单项。可使用热键选择相应的菜单。在调试程序或操作调试器中会使用一些快捷键来实现一些功能,下面将列出常用功能的快捷键及实现功能。
(三)、实验步骤
7.运行Tddebug软件,选择Edit菜单编写实验程序
8.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接,生成执行文件。
9.使用Rmrun菜单中的Run运行程序,观察运行结果。
10.使用Rmrun菜单中的Debug调试程序,查看程序段、数据段、附加段装入内存后的分配情况。单步执行数据传送指令后,观察各寄存器及数据区的内容。过程如下:
1)按F7单步执行,在代码区中有一个三角,表示正在执行的指令。每一条指令的执行一定会使目标寄存器和状态寄存器发生变化,从相关窗口看结果。
2)检查内存数据区的内容,关键是找出用户程序的数据段和附加段:
●方法1:在CPU窗口按Tab键使内存数据显示区成为活动区,按Ctrl+G键,输入:“DS或ES寄存器的值:偏移地址”,即可显示用户指定的数据区
●方法2:选择菜单View| Dump,弹出内存数据显示窗口。
3) 查看执行结果:按Alt+F5,切换到用户窗口。
11.更改数据区中的数据,考察、调试程序的正确性
三、程序清单及相关注释
;数据传送实验,采用相对寻址方式
DDATA SEGMENT ;定义源数据段
MSR DB "HELLO,WORLD!$"
LEN EQU $- MSR
DDATA ENDS
EXDA SEGMENT ;定义附加数据段
MSD DB LEN DUP(?)
EXDA ENDS
MYSTACK SEGMENT STACK ;定义堆栈段
DW 20 DUP(?)
MYSTACK ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DDATA,ES:EXDA
START: MOV AX,DDATA
MOV DS,AX ;装载数据段寄存器
MOV AX,EXDA
MOV ES,AX ;装载附加数据段寄存器
MOV SI,OFFSET MSR
MOV DI,OFFSET MSD
MOV CX,LEN
MOV BX,0
NEXT: MOV AL,MSR[BX] ;开始传输数据
MOV ES:MSD[BX],AL
INC BX
LOOP NEXT
PUSH ES
POP DS ;将附加段寄存器指向的段值赋给数据段寄存器
MOV DX,OFFSET MSD
MOV AH,9
INT 21H ;显示字符串
MOV AX,4C00H
INT 21H ;返回DOS状态
CODE ENDS
END START
四、分析实验结果
五、心得体会
第一次接触实际的汇编语言程序环境,熟悉了相应的操作,课本上的知识也得以应用,但是好像课程与实验有些脱节,所以需要更多的自学。
实验二 I/O程序设计
一、实验题目
1.【示例】:将指定数据区中一个字节的数据以十六进制数形式显示在屏幕上。
2.编程由键盘输入任意一个字符,将该字符的ASCII码值显示在屏幕上。
设计思路:在第一题MOV SI,OFFSET SD之后增加如下代码段
MOV AH, 01H ;键盘输入并回显
INT 21H
MOV DS:[SI],AL ;将AL中键入的ASCII码存入数据段
MOV AH, 02H ;输出回车换行符
MOV DL, 0AH
INT 21H
二、分析设计思想,绘制实验原理图、流程图
设计思路:首先将该数以十六进制数形式分解,然后将每一位分别转换为ASCII码送屏幕显示。其中0H~9H之间的数加30H,即可得0H~9H的ASCII码,而AH~FH的ASCII码,则需再加7H,参见表5-1。参考程序流程如图2-1所示。
三、程序清单及相关注释
;1.显示a的HEX
DATA SEGMENT USE16
MES DB 'Show a as hex:',0AH,0DH,'$'
SD DB 'a'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MES ;显示提示信息
MOV AH,09H
INT 21H
MOV SI,OFFSET SD
MOV AL,DS:[SI]
AND AL,0F0H ;取高4位
SHR AL,4
CMP AL,0AH ;是否是A以上的数
JB C2
ADD AL,07H
C2: ADD AL,30H
MOV DL,AL ;显示字符
MOV AH,02H
INT 21H
MOV AL,DS:[SI]
AND AL,0FH ;取低4位
CMP AL,0AH
JB C3
ADD AL,07H
C3: ADD AL,30H
MOV DL,AL ;显示字符
MOV AH,02H
INT 21H
MOV AX,4C00H ;返回DOS
INT 21H
CODE ENDS
END START
START
;2.显示输入字符的HEX
DATA SEGMENT USE16
MSG DB 'Input a char: $'
MES DB 0AH,0DH,'Show a as hex:',0AH,0DH,'$'
SD DB 'a'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MSG ;显示提示信息
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV SI,OFFSET MES
MOV [SI+5],AL
MOV [SD],AL
MOV DX,OFFSET MES ;显示提示信息
MOV AH,09H
INT 21H
MOV SI,OFFSET SD
MOV AL,DS:[SI]
AND AL,0F0H ;取高4位
SHR AL,4
CMP AL,0AH ;是否是A以上的数
JB C2
ADD AL,07H
C2: ADD AL,30H
MOV DL,AL ;显示字符
MOV AH,02H
INT 21H
MOV AL,DS:[SI]
AND AL,0FH ;取低4位
CMP AL,0AH
JB C3
ADD AL,07H
C3: ADD AL,30H
MOV DL,AL ;显示字符
MOV AH,02H
INT 21H
MOV AX,4C00H ;返回DOS
INT 21H
CODE ENDS
END START
START
四、分析实验结果
1、【示例】:
2、输入字符“,”的结果是:
五、心得体会
在第一次实验的基础上,对汇编语言编写程序有了一定的认识和基础,在完成第一道实验题之后,第二题通过自己查阅书籍以及老师的耐性指导,终于完成了,颇有小成就感。
实验三 代码转换程序设计
一、实验题目
2.编写程序将内存中一个字的数转换为十进制数的数字串显示。
二、分析设计思想,绘制实验原理图、流程图
设计思想:五位十进制数可表示为
因此,将十六位二进制数转换为5位ASCII码表示的十进制数数字串,即采用除10取余方法,分别求,并将它们转换为ASCII码。以字符串方式显示在屏幕上
三、程序清单及相关注释
DDATA SEGMENT
MES DB '十进制: $'
BUF DW 1234
DB 5 dup (0)
DDATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DDATA
START:MOV AX,DDATA
MOV DS,AX
MOV SI,OFFSET BUF
MOV AX,DS:[SI]
MOV BL,0AH ;送被除数
ADD SI,7 ;SI指向存储位置末尾
MOV CX,5
A: DEC SI ;SI=SI-1
DIV BL ;被除数在AX中,除数在BL中,结果的商在AL中,余数在AH中
ADD AH,30H
MOV DS:[SI],AH
MOV AH,0 ;清零余数,是AX参与下次运算
CMP AL,0
LOOPNZ A
MOV DX,OFFSET MES ;显示提示信息
MOV AH,09H
INT 21H
MOV CX,5
MOV SI,OFFSET BUF
ADD SI,2
B: MOV DL,DS:[SI] ; 显示十进制字符串
MOV AH,02H
INT 21H
INC SI
LOOP B
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END START
四、分析实验结果
1. 内存中一个字的数转换为十进制数的数字串
五、心得体会
这一次的实验,运用了更多的指令算法,课程脱节的问题也更明显地暴露出来,没有抓住核心的我走了不少弯路,但是只要用心,又有老师指导,还是能够出色地完成本次实验,并且先于理论课程学到了更新的知识。
实验四 分支程序设计
一、实验题目
4.从键盘输入一个字符,判断该字符是小写字母、大写字母、数字或其他字符,并给出相应的提示。
二、分析设计思想,绘制实验原理图、流程图
三、程序清单及相关注释
DATA SEGMENT
MSG1 DB ' is a number! $ '
MSG2 DB ' is the upper case of an english char! $ '
MSG3 DB ' is the lower of an english char! $ '
MSG4 DB ' is an another char$ '
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA
START:
MOV AX , DATA
MOV DS, AX
MOV AH, 01H
INT 21H
CALL JUDGE
;显示
MOV AH, 9
INT 21H
MOV AH,4CH
INT 21H
;子程序
JUDGE PROC
MOV DX,OFFSET MSG4
CMP AL,'0'
JB RETURN
CMP AL,'9'
JA NOTNUMBER
MOV DX,OFFSET MSG1
RET
NOTNUMBER:
CMP AL,'A'
JB RETURN
CMP AL,'Z'
JA NOTUPPER
MOV DX,OFFSET MSG2
RET
NOTUPPER:
CMP AL,'a'
JB RETURN
CMP AL,'z'
JA RETURN
MOV DX,OFFSET MSG3
RETURN:
RET
JUDGE ENDP
CODE ENDS
END START
四、分析实验结果
五、心得体会
转眼就到了最后一次实验了,本次汇编语言的实验系列自己收获很多,哪怕理论课程没有学的扎实,通过实际的实验操作也让自己更牢固地掌握了相关知识。