实验一 基础汇编语言程序设计
一、实验目的:
1、学习和了解TEC-XP16教学实验系统监控命令的用法。 2、学习和了解TEC-XP16教学实验系统的指令系统。 3、学习简单的TEC-XP16教学实验系统汇编程序设计。
二、预习要求:
1、学习TEC-XP16机监控命令的用法。
2、学习TEC-XP16机的指令系统、汇编程序设计及监控程序中子程序调用。 3、学习TEC-XP16机的使用,包括开关、指示灯、按键等。 4、了解实验内容、实验步骤和要求。
三、实验步骤:
在教学计算机硬件系统上建立与调试汇编程序有几种操作办法。
第一种办法,是使用监控程序的A命令,逐行输入并直接汇编单条的汇编语句,之后使用G命令运行这个程序。缺点是不支持汇编伪指令,修改已有程序源代码相对麻烦一些,适用于建立与运行短小的汇编程序。
第二种办法,是使用增强型的监控程序中的W命令建立完整的汇编程序,然后用M命令对建立起来的汇编程序执行汇编操作,接下来用G命令运行这个程序。适用于比较短小的程序。此时可以支持汇编伪指令,修改已经在内存中的汇编程序源代码的操作更方便一些。
第三种办法,是使用交叉汇编程序ASEC,首先在PC机上,用PC机的编辑程序建立完整的汇编程序,然后用ASEC对建立起来的汇编程序执行汇编操作,接下来把汇编操作产生的二进制的机器指令代码文件内容传送到教学机的内存中,就可以运行这个程序了。适用于规模任意大小的程序。
在这里我们只采用第一种方法。
在TEC-XP16机终端上调试汇编程序要经过以下几步:
1、使教学计算机处于正常运行状态(具体步骤见附录联机通讯指南)。 2、使用监控命令输入程序并调试。 ⑴用监控命令A输入汇编程序 >A 或 >A 主存地址
如:在命令行提示符状态下输入:
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 命令输入程序的操作过程)
若输入有误,系统会给出提示并显示出错地址,用户只需在该地址重新输入正确的指令即可。
⑵用监控命令U调出输入过的程序并显示在屏幕上 >U 或 >U 主存地址
如:在命令行提示符状态下输入: U 2000↙
在相应的地址会得到输入的指令及其操作码
注意:连续使用不带参数的U命令时,将从上一次反汇编的最后一条语句之后接着继续反汇编。
通过这一步进一步检查程序是否有除了语法外的其它错误。 ⑶通过监控命令G(连续执行)或T/P(单步执行)执行程序 >G/T/P 或 >G/T/P 主存地址 如:在命令行提示符状态下输入: G 2000↙
程序运行结束后,可以看到程序的运行结果,屏幕显示各寄存器的值,其中R0和R1的值均为5555H,说明程序运行正确。
⑷ 修改或显示寄存器或内存值的命令。R、D、E命令的使用 1)用R命令查看寄存器内容或修改寄存器的内容 a.在命令行提示符状态下输入:
R↙ ;显示寄存器的内容
注意:寄存器的内容在运行程序或执行命令后会发生变化。 b.在命令行提示符状态下输入:
R R0↙ ;修改寄存器R0 的内容,被修改的寄存器与所赋值之间可以无空格,也可有一个或数个空格 主机显示: 寄存器原值:_
在该提示符下输入新的值0036
再用R命令显示寄存器内容,则R0的内容变为0036。 2)用D命令显示存储器内容 在命令行提示符状态下输入: D 2000↙
会显示从2000H地址开始的连续128个字的内容;
连续使用不带参数的D命令,起始地址会自动加128(即80H)。 3)用E命令修改存储器内容 在命令行提示符状态下输入: E 2000↙ 屏幕显示:
2000 地址单元的原有内容:光标闪烁等待输入 输入0000
依次改变地址单元2001-2005的内容为:1111 2222 3333 4444 5555
注意:用E命令连续修改内存单元的值时,每修改完一个,按一下空格键,系统会自动给出下一个内存单元的值,等待修改;按回车键则退出E命令。 四、实验内容:
1、输入下列各汇编程序段,将结果调试出来,并回答问题。 程序1: A 2000↙ 2000: IN 81
SHR R0 SHR R0
JRNC 2000 IN 80 OUT 80 RET
注意:在十六位机中,基本I/O接口的地址是确定的,数据口的地址为80,状态口的地址为81。 问题:
⑴ 该程序段的功能是什么?
从键盘上接收一个字符并在屏幕上输出显示该字符
程序2: >A 2060↙
2060:MVRD R1,0000
MVRD R2,00OA MVRD R3,0000 2066:INC R3
ADD R1,R3 CMP R3,R2 JRNZ 2066 RET 问题:
⑴ 该程序段的功能是什么?
计算1到10的累加和
⑵ 如何察看结果?结果是什么?
输入G 2060 结果为:R1=0037 R2=00OA R3=00OA
⑶ 请用一字长的指令替换程序中的MOV R3,0 写出该语句。 Mov r3,r1 程序3:
用次数控制在终端屏幕上输出'0'到'9'十个数字符。 >A 2020↙
2020:MVRD R2,00OA ;送入输出字符个数
MVRD R0,0030 ;“0”字符的ASCII 码送寄存器R0 OUT 80 ;输出保存在R0 低位字节的字符 DEC R2 ;输出字符个数减1
JRZ 202E ;判10个字符输出完否,已完,则转到程序结束处 PUSH R0 ;未完,保存R0 的值到堆栈中 2028: IN 81 ;查询接口状态,判字符串行输出完成否,
SHR R0 ;
JRNC 2028 ;未完成, 则循环等待
POP R0 ;已完成, 准备输出下一字符并从堆栈恢复R0 的值 INC R0 ;得到下一个要输出的字符 JR 2024 ;转去输出字符 202E: RET
五、思考题:
⑴若把IN 81, SHR R0, JRNC 2028 三个语句换成4个MVRR R0,R0 语句, 该程序执行过程会出现什么现象? 试分析并实际执行一次。
程序改变这三条语句后,若用 T 命令单条执行,会依次显示 0,9 十个数字。若用 G 命令运行程序,由于程序运行速度快,端口串行输出的速度很慢,这样新会丢失某些输出的字行;如,在命令行提示符状态下输入 G 2020 命令后,屏幕可能的显示为 059 或 069 ,而不是 023456789全部的 10 个字符。
⑵若要求在终端屏幕上输出'A'到'Z'共26个英文字母,应如何修改程序? 请验证之。 A 2100
MVRD R2,001A MVRD R0,0041 OUT 80 DEC R2 JRZ 210E PUSH R0 IN 81