实验一:显示程序实验(2012年4月22日)
1、实验目的及实验内容
实验目的:
1.掌握在PC机上以十六进制数形式显示数据的方法
2.掌握部分DOS功能调用的使用方法
3.熟悉Tddebug调试环境和Turbo Debugger的使用
实验内容及说明:
本实验要求将指定的数据区的数据以十六进制数形式显示在屏幕上,并通过DOS功能调用完成一些提示信息的显示。
0~9的ASII码为:30H~39H,转换时,直接在原数据后面加上30H即可;A以后的数据
ASII码为:41H~ 在原数据上加上7H,再加上30H即可。 实验中可使用DOS功能调用(INT21H)。 1.显示单个字符 入口:AH=02H
调用参数:DL=输出字符 2.显示字符串 入口:AH=09H
调用参数:DS:DX:串地址,’$’为结束字符 3.键盘输入并回显 入口:AH=01H
调用参数:AL=输出字符
若不回显,入口:AH=07H 或 AH=10H 4.返回DOS系统
入口:AH=4CH
调用参数:AL=返回码
2、实验环境及实验步骤 实验环境:PC机一台 实验步骤:
1.运行Tddebug软件,选择Edit菜单,根据实验内容的描述编写实验程序。显示部分实验流程图如下:
2.使用Compile菜单中的Compile和Link对实验程序进行汇编、连接 3.使用Run菜单中的Run运行程序,观察运行结果
4.使用Run菜单中的Debug调试程序,观察调试过程中的数据传输指令执行后各寄存器及数据区的内容
5.更改数据区中的数据,考察程序的正确性 本实验的显示部分试验流程如图所示
取字节的高4位N数据是否大于等于A?Y是A-F,加7H转换成ASCH码送屏幕显示取字节的低四位数据是否大于等于A?NY是A-F,加7H转换成ASCH码送屏幕显示
3、实验过程与分析
(1).取字节的高四位的实现
首先将一个字节读入寄存器,将该字节同0F0H相与,即可将该字节的高四位保持不变而第四位变为全0。然后将相与后的字节右移四位即得到原始字节的高四位。
(2).取字节的低四位的实现
同取字节的高四位方法类似,将字节同0FH相与,即可将该字节的低四位保持不变而高四位变为全0。这样保存原始字节的寄存器中内容变为字节的低四位。
(3).数据转换成16进制的ASCII码在屏幕显示的实现
根据转换公式,若高(低)字节数据是0~9,就直接加30H即可转化为相应的ASCII码,如对数据“A”高字节为“0100”,屏幕应该要显示“4”。故高字节“0100”需要加上30H即“0110000”才能构成4的ASCII码“0110100”即屏幕显示“4”。若高(低)字节数据是A~F,就直接加37H即可转化为相应的ASCII码,如对数据“K”的低字节为“1011”,屏幕应该要显示“B”,故低字节“1011”需要加上37H即“0110111”才能构成B的ASCII码“1000010”即屏幕显示“B“。 (注:A的16进制ASCII码为41H,K的16进制ASCII码为4BH)
(4).数据区内容输出的实现
显示单个字符即设置入口AH=02H,调用参数DL=输出字符。显示字符串即设置入口AH=01H,调用参数DS:DX:串地址,以“$”为结束符。
程序代码:
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 ;Show message 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 ;show character MOV AH,02H INT 21H
MOV AL,DS:[SI] AND AL,0FH CMP AL,0AH JB C3 ADD AL,07H C3:ADD AL,30H
MOV DL,AL ;show character MOV AH,02H INT 21H
MOV AX,4C00H ;go back to dos INT 21H CODE ENDS
END START
将上述程序保存为.ASM文件,编译、连接,再执行。
输出结果:61(a的ASII码)
4、实验结果总结
根据实验结果,程序运行能正常显示出字符串和相应数据的16进制ASCII码制,
达到了实验的目的。
本次实验代码有老师提供,主要是了解tddebug软件的使用,程序代码不难看懂,但其格式不甚了解,在自己编程的时候会感觉无从下手,应进一步的学习汇编语言。
实验二:描述符及描述符表实验(2012年5月13日) 1、实验目的及实验内容
实验目的:
1、熟悉保护模式的编程格式和描述符的声明方法 2、掌握使用选择符访问段的寻址方法
3、学习和掌握静态存储器6264的特性及扩展方法 4、熟悉通过保护模式访问扩展存储器的方法 实验内容:
32位微机保护模式下全局描述符及描述符表
要求实现在一个0级代码段中将源数据段中的一段数据复制到目标数据段中。其中
所有的段描述符均放置在GDT中。
2、实验环境及实验步骤
实验环境:PC机一台,TD-PIT实验装置一套。 实验步骤:
1、运行TDDebug软件,选择Edit菜单编写实验程序
描述GDT
声明各数据段
在0级代码段中实现数据传输
结束
2、使用Compile菜单中的Compile和Link对试验程序进行汇编、连接 3、使用Pmrun装入实验程序。如果装入成功屏幕上会显示“Load OK!”,否则会给
出相应的错误提示信息
4、若程序成功装入,可使用R命令查看调试系统为实验程序分配的系统资源 5、使用GDT命令查询系统的GDT,并查看实验程序中声明的代码段、数据段描述符
在GDT中的位置以及对应段的物理地址、段属性和段界限等 6、使用F9运行程序,如果程序正常结束,命令显示区中将显示“Correct Running” 7、使用T命令单步执行程序,在单步过程中使用D命令查询数据源数据区及目标
数据区中的数据,验证执行的正确性
3、实验过程与分析
1) 数据结构的组织实现
在程序开始声明一个数据段“DESG”来描述这三个段的描述符,其中有代码段描述符SCODE、源数据段描述符DATAS和目标数据段描述符DATAD,将他们的选择子分别定义为SCODE_SEL、DATAS_SEL、DATAD_SEL。 2) 三个描述符的定义实现
代码段描述符:SCODE DESC
为了给装入程序提供重定位信息,三个存储段描述符中地址的低16位用每个描述符对应的标号来填写。在程序装入内存时。调试系统会根据地址的低16位重定位该段对应的真实物理地址,并将该地址写入描述符中。
源程序: .386P DESC STRUC ;定义描述符结构 LIMITL DW 0 BASEL DW 0 BASEM DB 0 ATTR DB 0 LIMITH DB 0 BASEH DB 0 DESC ENDS ATCE = 98H ;定义特殊常量 ATDR = 90H ATDW = 92H DSEG SEGMENT PARA USE16 ;声明开始初始化GDT中的描述符 GDT LABEL BYTE
ID1 DESC <0FFFFH,0FFFFH,0FFH,0FFH,0FFH,0FFH> ;标记1
SCODE DESC <0FFFFH,CSEG,,ATCE,,> ;代码段描述符 DATAS DESC
SCODE_SEL = SCODE-GDT ;代码段选择子 DATAS_SEL = DATAS-GDT ;源数据段选择子 DATAD_SEL = DATAD-GDT ;目标数据段选择子
ID2 DESC <0FFFFH,0FFFFH,0FFH,0FFH,0FFH,0FFH > ;标记2 ID3 DESC <0FFFFH,0FFFFH,0FFH,0FFH,0FFH,0FFH > ;标记3 DSEG ENDS ;定义源数据段