文档库 最新最全的文档下载
当前位置:文档库 › 《汇编语言程序设计》

《汇编语言程序设计》

《汇编语言程序设计》
《汇编语言程序设计》

《汇编语言程序设计》

实验一

实验目的:

1. 学习和了解TEC— 3 机监控命令的用法;

2. 学习和了解TEC— 3 机的指令系统:

3. 学习简单的解TEC— 3 机的汇编程序设计.

实验内容:

用教学机上已实现的指令编写汇编程序,运行并观察运行结果.

使用监控程序的 R 命令显示/修改寄存器内容:

使用 D 命令显示存储器内容,使用 E 修改存储器内容:

使用A命令写-小段汇编程序, U 命令反汇编刚输入的程序;

用 G 命令连续运行该程序,用 T,P 命令单步运行并观察程序单步执行情况;

实验要求

在使用该实验台之前,应先熟悉实验台的各个组成部分及其使用方法。

实验步骤

1.确保两个红色微型开关左侧的短路子处于断开状态( 短接子被拔下来) ;

2.在关闭教学机电源情况下,将大板上的 COM2 口 (左侧的一个) 与PC机的串口相连;

3.接电源,在pc上运行 PCEC.EXE 文件,设置所用pc机的串口为 "1" 或 "2" 。

其它的设置一般不用改动,直接回车即可:

4.置控制开关为 000(连续、正常运行、助合逻辑) ,开关拨向上方表示“ 1 ”,

拨向下方表示 "0" , "X" 表示任意.其它实验相同;

5.按下重新设定了的同时按下步骤按钮,松开后再按一下步骤按钮,主机上显示:

TEC— 3 Monitor Ver 3 .1

--by wei Xiaoliang Tsinghua Computor 中心, 2001 , C6 .—

> ( 教学计算机已处于正常运行状态,等待输入监控命令)

6. 用 R 命令查看寄存器内容或修改寄存器的内容

l >在命令行提示符状态下输入:

R ↙:显示寄存器的内容

执行后显示 12个寄存器的内容及状态标志。

例如,执行结果为:

R0=2FF R1=FF R2=FF R3=FF R4=00 R5=20R6=00 R7 =26

R8=FF R9= FF R10=FF R1= FF 州=00

注:这些显示结果是初始化后的寄存器的内容,运行程序或执行命令后寄存器的内容会发生变化.

2>在命令行提示行状态下输入:

R R036 ↙ ;修改寄存器 R0 的内容,修改的寄存器与所赋值之间不能有空格,否则系统会给出错误提示

再用 R 命令显示寄存器内容:则 R0 的内容变为36

7.用 D 命令显示存储器内容

在命令行提示符状态下输入:

D 2000↙:会显示从 2000 地址开始的 128 个存储字的内容.

连续的 D 命令,保证显示内容前后正确的连续关系,即每次执行 D 命令,会将默认的地址值加上 128 .

8.用 E 命令修改存储器内容

在命令行提示符状态下输入:

E 2000↙:用户可以从地址 2000 开始逐字节修改每个内存单元的内容

按如下格式输入:

2000: 66

2001: 77

2002: 88

用 D 命令显示着几个单元的内容

D 2000↙:可以看到这三个地址单元的内容变为 66 、 77 、88

9.用A命令键入教学计算机的一段汇编源程序,主要是向累加器送入数据和执行运算,执行程序并观察运行结果

注意:在键入命令时, A , U , G , D , E , T , P 命令与其后所接的地址之间要加一个 (且只能一个) 空格;在输入指令时也要注意这点,若输入有误,在没有按回车之前,只需要将光标移到出错的位置,重新输入正确内容;若已回车,则键入命令出错地址并回车,系统给出出错地址,在该地址重新输入。

1)在命令行提示符状态下输入:

A 2000↙;表示该程序从 16 进制的 2000(内存随机存取储存器区的起始地址) 地址开始

屏幕将显示:

2000:

之后输入如下形式的程序:

2000: MVD R0 AA ;MVD 与 R0 之间只有一个空格,其他指令相同

2002: MVD R1 ,55

2004: ADD R0 ,R1

2005: AND R0 ,R1

2006: RET ;程序的最后一个语句,必须为RET指令

2007:(直接敲回车键,结束A命令的输入程序的操作过程)

2)用 U 命令反汇编刚输入的程序

在命令行提示符状态下输入:

U 2000↙:在相应的地址会得到输入的指令及其操作码

注:U 命令一次反汇编十五条指令,接下来键入不带参数的 U 命令时,将接着从上一次反汇编的最后一条语句之后继续反汇编。

3)用 G 命令运行前面刚键入源程序。

G 2000↙:程序运行结束后,可以看到程序的运行结果,屏幕显示各寄存器的值,其

中R0和 R1的值均为 55 ,说明程序运行正确.

4)用 P 或 T 命令,让这段程序单步执行,观察指令执行结果

在命令行提示符状态下输入:

T 2000↙:寄存器 R0 技赋值为 AA

T ↙:寄存器 Rl 被赋值为55

T ↙:做加法运算,和放在R0,R0的值变为 FF

T ↙:做与运算,结果放在R0,R0的值变为55

用 P 命令执行过程同上.

注: T 命令总是执行单条指令,但执行 P 命令时,则把每一个 CAL 上语句连同被调用的子程序一次执行完成。T,P 命令每次执行后均显示所有通用寄存器及状态寄存器的

内容,并反汇编出下一条将要执行的指令.

举例编写汇编程序,用 "A" 命令输入,运行并观察结果

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

1)在命令行提示符状态下输入:

A 2000 ↙;表示该程序从 16 进制的 2000(内存 RAM 区的起始地址) 地址开始

屏幕将显示:

2000:

之后输入如下形式的程序:

2000: MVD R0, 36 ↙;把字符‘ 6'的美国信息交换标准代码送入R0

2002: OUT 00 ↙:输出字符‘ 6 ’到屏幕上, 00 为串行口的端口地址

2003: RET ↙;每个用户程序都必须用 RET 指令结束

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

2)用 "G" 命令运行程序

在命令行提示符状态下输入:

G 2000 ↙

执行上面输入的程序

显示结果为:

6

R0=36 R1=.......R11=:..STATE=:...

2000: MVD Ro ,36

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

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

例子2:设计一个小程序,用次数控制在终端屏幕上输出,‘ 0’,到‘ 9’,十个数字符.1>在命令行提示符状态下输入:

A 2020 ↙

屏幕将显示:

2020,

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

2020: MVD R2,0A ;送入输出字符个数(十进制的数值10)

2022: MVD R0,30 ;送 '0' 字符的ASCII 码到R0

2024: 0UT 00 ;输出保存在R0中的字符

2025: DEC R2 ;输出字符个数减1

2026: JZ 2031 ;判 10 个字符输出完否,已完,则转移到程序结束处

2028: PUSH Ro ;未完,保存 R0 的值到堆栈中

2029: IN 01 ;查询接口状态,判字符串行输出完成否,

202: SHR R0 :

2028:JNC,2029 ;未完成则循环等持

202D :POP R0 :已完成,准备继续输出下一字符,从堆栈恢复R0的值

202E:INC RO ;得到下一个要输出的字符

202F JR 2024 ;转回去继续输出字符

2031:RET

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

2>用 "G" 命令运行程序

在命令行提示符状态下输入:

G 2020↙

执行上面输入的程序

执行结果为=

0123456789

R0 :39 R1=...R2=00 R3=…

2020: MVD R2 , 0A

作业:当把IN 01 , SHR R0,JNC 2029 三个语句换成 4 个 MOV Ro , R0 语句,该程序执行过程会出现什么现象? 试分析并实际执行一次以观察运行结果。

提示:该程序改变这三条语句后,若用 T 命令单条执行,会依次显示 0,9 十个数字。若用 G 命令运行程序,由于程序运行速度快,端口串行输出的速度很慢,这样新会丢失某些输出的字行;如,在命令行提示符状态下输入 G 2020 命令后,屏幕可能的显示为 059 或069 ,而不是 023456789全部的 10 个字符。

作业:若要求在终端输出,‘A’,到‘Z’,共 26 个英文字.应如修改例 1 中给出的程序?请验证之。

参考答案:

1)在命令行提示持状态下输入:

A 2100 ↙

屏幕将显示:

2100:

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

2100: MVD R2,1A ;循环次数为26

MVD R0 , 4l;字符 "A" 的值

2104: OUT 00 :输出保存在R0低位字节的字符

DEC R2 ;输出字符个数减1

JZ 2111 :判26个字符输出完否,已完,则转移到程序结束处

PUSH R0 ;未完,保存R0的值到堆栈中

2109: IN 01;查询接口状态,判字符串行输出完成否

SHR R0

JNC 2109 ;未完成,则循环等待

POP R0 ;己完成,准备赖出下一字6。’从埃钱恢复则的值

INC R0 ;得到下一个要输出的字符

JNC 2104 :转去输出出字符

2111:RET

用G命令执行该程序,屏幂上显示“A”~“Z”26个英文字母.

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

1)在命令行提示符状态下输入:

A 2040↙

屏幕将显示:

2040:

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

(2040) MVD R2,30 ;用于判数字符的下界值

MVD R3,39 ;用于判数字19的上界值

(2044) IN 01 ;判键盘上是否按了一个键,

SHR R0 ;即串行口是否有了输入的字符

SHR R0

JNC 2044 ;没有的输入则循环测试

IN 00 ;输入字符到R0

CMP R0,R2 :判输入字符>=字符’0’否

JNC 2056 ;为否,则转到程序结束处

CMP R3, R0 ;判输入字符<=字符’9’否

JNC 2056 ;为否,则转到程序结束处

0UT 00 ;输出刚输入的数字符

MVD RB,20 ;转去程序前边2044处等待输入下一个字符

MVD RA,44 ;这3个语句完全可以用JR 2044替代

JMP ;此处要表明必须使用专用寄存器的JMP语句用法

[2056] RET

2)在命令行提示符状态下输入:

G 2040/

光标闪烁等待键盘输入,若输入的是属于‘0’—‘9’中的一个数字符,则在屏幕上回显;若输入非数字符,屏幕不会显示该字符,并结束运行过程.其后显示的,是程序结束时的现场内容,即显示11个寄存器的内容和状态标志后。接着回显第一条指令.出现命令提示符,等待输入新的命令.

作业:本程序中为什么不必判别串行口输出完成否?设计打入’A’一’Z’和’0’-‘9’,遇其它字符结束输入过程。

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

1)在命令行提示符状态下输入:

A 2060↙

屏幕将显示:

2060:

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

(2060)MYD R1, 00 ;置累加和的初值为0

MVD R2, 0A ;最大的加数.

MVD R3, 00

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

ADD Rl, R3 ;累加计算

CMP R3, R2 ;判是否累加完

JNC 2066 :未完,开始下一轮累加

RET

2)在命令行提示符状态下输入:

G 2060↙运行过后,可以用R命令累加器的内容.Rl的内容为累加和。

结果为:R1=37 R2=OA R3=0A

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

1)将被显示的6个字符‘A’~‘F’送入到内存20F0开始的存储区域中

在命令行提示符状态下输入:

E 20FO↙

屏幕将显示:

20F0:

按下列格式输入:

20Fo: 41

20F1: 42

20F2: 43

20F3: 44

20F4: 45

20F5: 45

2) 在命令行提示符状态下输入

A 2080↙

屏幕将显示:

2080:

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

(2080)MVD R3, 06 :指定技读数据的个数

MVD R9, 20 :指定被读、写数据内存区首地址

MVD R8, F0

(2086)LOD R0 :使内存中的一个字符到R0寄存器

MVD RB, 21 ;指定于程序地址为2100

MVD RA, 00

CALL ;调用于程序,完成显示、转换并写回的功能

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

JZ 2092 ;完成输出则结束程序的执行过程

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

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

(2092) RET

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

OUT 00 :输出保存在R0寄存器中的字符

MVD R1, 20 :转换保存在R0中的大写字母为小写字母

ADD R0, B1

STO R0 ;写R0中的字符到内存,地址同LOD所用的地址

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

SHR R0

JNC 2105 ;末完成输出过程则循环试

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

3)在命令行提示符状态下输入:

G 2080↙

屏幕显示运行结果为:

ABCDEF

11个寄存器内容及状态标志

2080: MVD R3,06

4)在命令行提示符状态下输入:

D 20F0↙

20F0—20F5内存单元的内容为:

6l 62 63 64 65 66

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

在用A命令输入汇编源语句的过程中,有一定用机经验的人,常常抱怨A命令中末提供适当的编辑功能,这并不是设计者的疏漏,因为我们并不准备在这种操作方式下支持设计较长的程序.这种工作应转到提供了交又汇编程序的PC机上去完成.相反的情况是,输入上述一些小程序,用监控程序的A命令完成,往往比用交又汇编完成更简捷.

相关文档