实验目的:
1.学习和了解TEC-2000 十六位机监控命令的用法; 2.学习和了解TEC-2000 十六位机的指令系统; 3.学习简单的TEC-2000 十六位机汇编程序设计;
实验内容:
1.使用监控程序的R 命令显示/修改寄存器内容、D 命令显示存储器内容、E 命令修改存储器内容;
2.使用A 命令写一小段汇编程序,U 命令反汇编刚输入的程序,用G 命令连续运行该程序,用T 命令单步运行并观察程序单步执行情况;
实验要求
在使用该教学机之前,应先熟悉其的各个组成部分,及使用方法。 实验步骤
1.关闭电源,将大板上的COM1 口与PC 机的串口相连;
2.接通电源,在PC 机上运行PCEC.EXE 文件,设置所用PC 机的串口为“1”, 其它的设置一般不用改动,直接回车即可;
3.置控制开关为00101(连续、内存读指令、组合逻辑、16 位、联机),开关拨向上方表示“1”,拨向下方表示“0”;
4.按一下“RESET ”按键,再按一下“START ”按键,主机上显示: TEC-2000 CRT MONITOR Version 2.0 April 2001
Computer Architectur Lab., Tsinghua University Programmed by He Jia >
5.用R 命令查看寄存器内容或修改寄存器的内容 1)在命令行提示符状态下输入: R↙ ;显示寄存器的内容
注:寄存器的内容在运行程序或执行命令后会发生变化。 2)在命令行提示符状态下输入:
R R0↙ ;修改寄存器R0 的内容,被修改的寄存器与所赋值之间可以无空格,也可有一个或数个空格主机显示:
寄存器原值:_
在该提示符下输入新的值0036
再用R 命令显示寄存器内容,则R0 的内容变为0036 。 6.用D 命令显示存储器内容
在命令行提示符状态下输入: D 2000↙
会显示从2000H 地址开始的连续128 个字的内容;
连续使用不带参数的D 命令,起始地址会自动加128 (即80H )。 7.用E 命令修改存储器内容 在命令行提示符状态下输入: E 2000↙ 屏幕显示:
2000 地址单元的原有内容:光标闪烁等待输入输入 0000
依次改变地址单元2001~2005 的内容为:1111 2222 3333 4444 5555
注意:用E 命令连续修改内存单元的值时,每修改完一个,按一下空格键,系统会自动给出下一个内存单元的值,等待修改;按回车键则退出E 命令。
用D 命令显示这几个单元的内容 D 2000↙
可以看到这六个地址单元的内容变为0000 1111 2222 3333 4444 5555 。
8.用A 命令键入一段汇编源程序,主要是向累加器送入数据和进行运算,执行程序并观察运行结果。
1)在命令行提示符状态下输入:
A 2000 ↙;表示该程序从2000H (内存RAM 区的起始地址)地址开始 屏幕将显示: 2000:
输入如下形式的程序:
2000: MVRD R0,AAAA ;MVRD 与R0 之间有且只有一个空格,其他指令相同 2002: MVRD R1,5555 2004: ADD R0,R1 2005: AND R0,R1
2006: RET ;程序的最后一个语句,必须为RET 指令 2007: (直接敲回车键,结束A 命令输入程序的操作过程)
若输入有误,系统会给出提示并显示出错地址,用户只需在该地址重新输入正确的指令即可。
2)用U 命令反汇编刚输入的程序在命令行提示符状态下输入: U 2000↙
在相应的地址会得到输入的指令及其操作码
注:连续使用不带参数的U 命令时,将接着从上一次反汇编的最后一条语句之后继续
反汇编。
3)用G 命令运行前面刚键入源程序 G 2000↙
程序运行结束后,可以看到程序的运行结果,屏幕显示各寄存器的值,其中R0 和R1 的值均为5555H ,说明程序运行正确。
4)用P 或T 命令,单步执行这段程序,观察指令执行结果在命令行提示符状态下输入: T 2000↙
寄存器R0 被赋值为AAAAH T↙
寄存器R1 被赋值为5555H T↙
做加法运算,和放在R0,R0 的值变为FFFFH T↙
做与运算,结果放在R0,R0 的值变为5555H 用P 命令执行过程同上。
注:T 总是执行单条指令,但执行P 命令时,则把每一个CALL 语句连同被调用的子程序一次执行完成。T、P 命令每次执行后均显示所有通用寄存器及状态寄存器的内容,并反汇编出下一条将要执行的指令。
7.举例编写汇编程序, 用“A”命令输入,运行并观察结果
1)例子1:设计一个小程序, 从键盘上接收一个字符并在屏幕上输出显示该字符。 <1> 在命令行提示符状态下输入: A 2000↙ ; 屏幕将显示: 2000:
输入如下形式的程序:
2000: IN 81 ;判键盘上是否按了一个键 2001:SHR R0 ;即串行口是否有了输入的字符 2002:SHR R0
2003:JRNC 2000 ;未输入完则循环测试 2004:IN 80 ;接收该字符
2005: OUT 80↙ ;在屏幕上输出显示字符‘6’ 2006: RET↙ ;每个用户程序都必须用RET 指令结束 2007:↙ ;(按回车键即结束输入过程)
注:在十六位机中,基本I/O 接口的地址是确定的,数据口的的值为80,状态口的地
址为81。
<2> 用“G”命令运行程序 在命令行提示符状态下输入: G 2000↙
执行上面输入的程序光标闪烁等待输入,用户从键盘键入字符后,屏幕会显示该字符。该例建立了一个从主存2000H 地址开始的小程序。在这种方式下, 所有的数字都约定使用16 进制数,故数字后不用跟字符H。每个用户程序的最后一个语句一定为RET 汇编语句。因为监控程序是选用类似子程序调用方式使实验者的程序投入运行的, 用户程序只有用RET 语句结束, 才能保证程序运行结束时能正确返回到监控程序的断点, 保证监控程序能继续控制教学机的运行过程。
2)例2:设计一个小程序, 用次数控制在终端屏幕上输出'0' 到'9' 十个数字符。 <1> 在命令行提示符状态下输入: A 2020↙ 屏幕将显示: 2020:
从地址2020H 开始输入下列程序: 2020:MVRD R2,00OA ;送入输出字符个数
2022:MVRD R0,0030 ;“0”字符的ASCII 码送寄存器R0 2024:OUT 80 ;输出保存在R0 低位字节的字符 2025:DEC R2 ;输出字符个数减1
2026:JRZ 202E ;判10 个字符输出完否,已完,则转到程序结束处 2027:PUSH R0 ;未完,保存R0 的值到堆栈中 2028:IN 81 ;查询接口状态,判字符串行输出完成否, 2029:SHR R0 ;
202A:JRNC 2028 ;未完成, 则循环等待
202B:POP R0 ;已完成, 准备输出下一字符并从堆栈恢复R0 的值 202C:INC R0 ;得到下一个要输出的字符 202D:JR 2024 ;转去输出字符 202E:RET 202F:↙
该程序的执行码放在2020H 起始的连续内存区中。若送入源码的过程中有错, 系统会进行提示, 等待重新输入正确汇编语句。在输入过程中, 在应输入语句的位置直接打回车则结束输入过程。
<2> 用“G”命令运行程序
在命令行提示符状态下输入: G 2020↙ 执行结果为: 0123456789
思考题: 类似的, 若要求在终端屏幕上输出'A' 到'Z' 共26 个英文字母,应如何修改例1 中给出的程序? 请验证之。
A 2020
2020:MVRD R2,001A ;送入输出字符个数26
2022:MVRD R0,0041 ;“A”字符的ASCII 码送寄存器R0 2024:OUT 80 ;输出保存在R0 低位字节的字符 2025:DEC R2 ;输出字符个数减1
2026:JRZ 202E ;判26 个字符输出完否,已完,则转到程序结束处 2027:PUSH R0 ;未完,保存R0 的值到堆栈中 2028:IN 81 ;查询接口状态,判字符串行输出完成否, 2029:SHR R0 ;
202A:JRNC 2028 ;未完成, 则循环等待
202B:POP R0 ;已完成, 准备输出下一字符并从堆栈恢复R0 的值 202C:INC R0 ;得到下一个要输出的字符 202D:JR 2024 ;转去输出字符 202E:RET 202F:↙
例子3: 从键盘上连续打入多个属于‘0’到‘9’的数字符并在屏幕上显示, 遇非数字符结束输入过程。
<1> 在命令行提示符状态下输入: A 2040↙ 屏幕将显示: 2040:
从地址2040H 开始输入下列程序:
(2040)MVRD R2, 0030 ; 用于判数字符的下界值
MVRD R3, 0039 ;用于判数字符的上界值
(2044) IN 81 ; 判键盘上是否按了一个键,
SHR R0 ; 即串行口是否有了输入的字符 SHR R0
JRNC 2044 ; 没有输入则循环测试 IN 80 ; 输入字符到R0 MVRD R1,00FF
AND R0,R1 ;清零R0 的高位字节内容 CMP R0, R2 ; 判输入字符≥字符'0' 否 JRNC 2053 ; 为否, 则转到程序结束处
CMP R3, R0 ; 判输入字符≤字符'9' 否 JRNC 2053 ; 为否, 则转到程序结束处 OUT 80 ; 输出刚输入的数字符
JMPA 2044 ; 转去程序前边2044 处等待输入下一个字符 (2053) RET
<2> 在命令行提示符状态下输入: G 2040↙
光标闪烁等待键盘输入,若输入0-9 十个数字符,则在屏幕上回显;若输入非数字符,则屏幕不再显示该字符,出现命令提示符,等待新命令。
思考题, 本程序中为什么不必判别串行口输出完成否? 设计打入'A'~'Z'和'0'~'9' 的程序, 遇其它字符结束输入过程。
A 2040
(2040)MVRD R2, 0041 ; 用于判字母符的下界值
MVRD R3, 005A ;用于判字母符的上界值 MVRD R4,0030;用于判数字符的下界值 MVRD R5,0039;用于判数字符的下界值 MVRD R6, 0061 ; 用于判字母符的下界值 MVRD R7, 007A ;用于判字母符的上界值
(204C) IN 81 ; 判键盘上是否按了一个键,
SHR R0 ; 即串行口是否有了输入的字符 SHR R0
JRNC 204C ; 没有输入则循环测试 IN 80 ; 输入字符到R0 MVRD R1,00FF
AND R0,R1 ;清零R0 的高位字节内容
(2054)
CMP R0, R2 ; 判输入字符≥字符'A' 否 JRNC 205A ; 为否, 则转到程序结束处 CMP R3, R0 ; 判输入字符'Z'≥字符 否
JRNC 205A ; 为否, 则转到程序结束处 JMPA 2064
CMP R0, R6 ; 判输入字符≥字符'A' 否 JRNC 2060 ; 为否, 则转到程序结束处 CMP R7, R0 ; 判输入字符'Z'≥字符 否 JRNC 2060 ; 为否, 则转到程序结束处
(205A)
JMPA 2064
(2060)
CMP R0, R4 ; 判输入字符≥字符'0' 否 JRNC 2067 ; 为否, 则转到程序结束处 CMP R5, R0 ; 判输入字符≤字符'9' 否 JRNC 2067 ; 为否, 则转到程序结束处
(2064)
OUT 80 ; 输出刚输入的数字符
JMPA 204C ; 转去程序前边204C 处等待输入下一个字符
(2067) RET
8.设计一个小程序, 计算1 到100 的累加和。 A 2060
(2060)MVRD R1,0000;累加和R1初值为0
MVRD R2,0064;最大值为100 MVRD R3,0000;累加第一个数R3
(2066)INC R3;R3自增
ADD R1,R3
CMP R3,R2;判断R3>=R2 JRNZ 2066;否,跳至2066 RET
因篇幅问题不能全部显示,请点此查看更多更全内容