基础汇编语言程序设计实验指导

更新时间:2023-06-10 22:39:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基础汇编语言程序设计

实验目的:

1. 学习和了解 TEC-2000 十六位机监控命令的用法;

2. 学习和了解 TEC-2000 十六位机的指令系统;

3. 学习简单的 TEC-2000 十六位机汇编程序设计;

实验内容:

1. 使用监控程序的 R 命令显示/修改寄存器内容、D命令显示存储器内容、E命令修改存储器内容;

2. 使用 A 命令写一小段汇编程序,U 命令反汇编刚输入的程序,用 G 命令连续运行该程序,用 T命令单步运行并观察程序单步执行情况;

3、执行下面程序,查看执行过程。

4、编写汇编语言程序,编写汇编语言程序,实现10(十进制)以内一位数的乘法运算,例如输入“8*9=”同步显示8*9=后接着显示72,即“8*9=72”。或实现100(十进制)以内两位数的乘法运算,例如输入“8*9=”同步显示8*9=后接着显示72,即“8*9=72”;如果输入“12*12=”则显示“12*12=144”。

实验要求

在使用该教学机之前,应先熟悉其的各个组成部分,及使用方法。

十六位教学机的汇编语言程序设计举例

例子 1:设计一个小程序, 在屏幕上输出显示字符‘6’ 。

A 2000 ;地址从 16进制的 2000(内存 RAM区的起始地址)开始 2000: MVRD R0, 0036 ;把字符‘6’的ASCII 码送入 R0

2002: OUT 80 ;在屏幕上输出显示字符‘6’ , 80 为串行接口地址 2003: RET ;每个用户程序都必须用 RET 指令结束

2004: (按回车键即结束输入过程)

这就建立了一个从主存 2000h 地址开始的小程序。在这种方式下, 所有的数字都约定使用 16 进制数,故数字后不用跟字符 h。每个用户程序的最后一个语句一定为 RET汇编语句。因为监控程序是选用类似子程序调用方式使实验者的程序投入运行的,用户程序只有用RET语句结束, 才能保证程序运行结束时能正确返回到监控程序的断点, 保证监控程序能继续控制教学机的运行过程。

下面接着再给出几个小程序的例子。

例子 2: 设计一个小程序, 用次数控制在终端屏幕上输出'0'到'9'十个数字符。

A 2020

MVRD R2,000A ;送入输出字符个数

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

这个程序只使用基本汇编语句。理解中的一个难点, 是程序当中判串行口是否完成一个字符的输出过程并循环等待的三个汇编语句。具体解释见有关串行接口讲解部分的内容。

该程序的执行码放在 2020 起始的连续内存区中。若送入源码的过程中有错, 系统会进行提示, 等待重新打入正确汇编语句。在输入过程中, 在应打入语句的位置直接打回车则结束输入过程。接下来可用 G 2020 命令运行该程序。

思考题: 当把 IN 01, SHR R0, JNC, 2029 三个语句换成 4 个 MVRR R0,R0 语句, 该程序执行过程会出现什么现象? 试分析并实际执行一次。

类似的, 若要求在终端屏幕上输出'A'到'Z'共 26 个英文字母, 应如何修改例 1 中给出的程序? 请验证之。

例子3: 从键盘上连续打入多个属于'0'到'9'的数字符并在屏幕上显示, 遇非数字符结束输入。

A 2040

(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 R0, R3 ; 判输入字符≤字符'9'否

JRC 2053 ; 为否, 则转到程序结束处 ,想一想做这步有什么用!!

OUT 80 ; 输出刚输入的数字符

JMPA 2044 ; 转去程序前边 2044 处等待输入下一个字符

(2053) RET

思考题, 本程序中为什么不必判别串行口输出完成否? 设计打入'A'~'Z'和'0'~'9'的程序, 遇其它字符结束输入过程。

从地址 2040开始输入下列程序:

例子 4: 计算 1 到10 的累加和。

A 2060

(2060)MVRD R1, 0000 ; 置累加和的初值为 0

MVRD R2, 000A ; 最大的加数

MVRD R3, 0000

(2066)INC R3 ; 得到下一个参加累加的数

ADD R1, R3 ; 累加计算

CMP R3, R2 ; 判是否累加完

JRNZ 2066 ; 未完, 开始下一轮累加

RET

运行过后, 可以用 R 命令看 R1 中的累加结果。

例子 5: 设计一个有读写内存和子程序调用指令的程序,功能是读出内存中的字符,将其显示到显示器的屏幕上,转换为小写字母后再写回存储器原存储区域。

E 20F0 (送入将被显示的 6 个字符‘A’~‘F’到内存 20F0开始的存储区域中) 0041 0042 0043 0044 0045 0046

A 2080

(2080)MVRD R3, 0006 ;指定被读数据的个数

MVRD R2, 20F0 ;指定被读、写数据内存区首地址

(2084)LDRR R0,[R2] ;读内存中的一个字符到 R0 寄存器

MVRD R8, 2100 ;指定子程序地址为2100 *此条指令与下一条指令可以改为CALA CALR R8 ;调用子程序,完成显示、转换并写回的功能

DEC R3 ;检查输出的字符个数

JRZ 208C ;完成输出则结束程序的执行过程

INC R2 ;未完成,修改内存地址

JR 2084 ;转移到程序的 2086 处,循环执行规定的处理

(208C)RET

A 2100 ; 输入用到的子程序到内存 2100 开始的存储区

(2100)OUT 80 ;输出保存在 R0 寄存器中的字符

MVRD R1,0020

ADD R0,R1 ;将保存在 R0 中的大写字母转换为小写字母

STRR [R2],R0 ;写 R0 中的字符到内存,地址同 LOD 所用的地址

(2105)IN 81 ;测试串行接口是否完成输出过程

SHR R0

JRNC 2105 ;未完成输出过程则循环测试

RET ;结束子程序执行过程,返回主程序

运行过程中,可以直接看到屏幕上显示的内容,运行过后, 再用 D 20F0 看内存的 20F0 区 域中保存的运行结果:

0061 0062 0063 0064 0065 0066

上述 5 个例子, 都是用监控程序的 A 命令完成输入源汇编程序的。在涉及到汇编语句标号的地方, 不能用符号表示, 只能在指令中使用绝对地址。使用内存中的数据, 也由程序员给出数据在内存中的绝对地址。显而易见, 对这样的极短小程序矛盾并不突出, 但很容易想到,对很大的程序, 一定会有较大的困难。

在用 A 命令输入汇编源语句的过程中, 有一定用机经验的人, 常常抱怨 A 命令中未提供适当的编辑功能, 这并不是设计者的疏漏, 因为我们并不准备在这种操作方式下支持设计较

长的程序, 这种工作应转到提供了交叉汇编程序的 PC 机上去完成。相反的情况是, 输入上述一些小程序, 用监控程序的 A 命令完成, 往往比用交叉汇编完成更简捷。

本文来源:https://www.bwwdw.com/article/jhx1.html

Top