计算机组成原理实验指导书
7.用E命令修改存储器内容 在命令行提示符状态下输入: E 2000↙ 屏幕显示:
2000 xxxx(地址单元的原有内容):(光标在此闪烁等待输入) 输入0000
(提示快捷使用方法:用E命令连续修改内存单元的值时,每修改完—个,按一下空格键,系统会自动给出下一个内存单元的值,等待修改;按回车键则退出E命令。) 依次改变地址单元2001~2005的内容为:1111 2222 3333 4444 5555 用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的值。 R0=? R1=?
4)用P或T命令,单步执行这段程序,观察指令执行结果
在命令行提示符状态下输入:
T 2000↙ 寄存器R0=? T↙
寄存器R1=? T↙
寄存器R0=?
4
计算机组成原理实验指导书
T↙
寄存器R0=?
用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 2006:RET 2007:↙
;判断键盘上是否按了一个键 ;即串行口是否有了输入的字符 ;未输入完则循环测试 ;接收该字符
;在屏幕上输出该字符
;每个用户程序都必须用RET指令结束 ;(按回车键即结束输入过程)
注:在十六位机中,基本I/0接口的地址是确定的,数据口的地址为80H,状态口的地址为81H。
<2>用“G”命令运行程序
在命令行提示符状态下输入:
G 2000↙
执行上面输入的程序。
光标闪烁等待输入,用户从键盘键入字符后,屏幕会显示该字符。
该例建立了一个从主存2000H地址开始的小程序。在这种方式下,所有的数字都约定使用16进制数,故数字后不用跟字符H。每个用户程序的最后一个语句一定为RET汇编语句。因为监控程序是选用类似子程序调用方式使实验者的程序投入运行的,用户程序只有用RET语句结束,才能保证程序运行结束时能正确返回到监控程序的断点,保证监控程序能继续控制教学机的运行过程。
2)例2:设计一个小程序,用次数控制在终端屏幕上输出‘0’到‘9’十个数字符。
<1>在命令行提示符状态下输入:
A 2020↙ 屏幕将显示:
2020:
从地址2020H开始输入下列程序: 2020:MVRD R2,000A 2022:MVRD R0,0030 2024:OUT 80 2025:DEC R2
;送入输出字符个数 ;“0”字符的ASCII码送寄存器R0 ;输出保存在R0低位字节的字符 ;输出字符个数减1,置状态位Z
2026:JRZ 202E ;判10个字符输出完否,已完,则转到程序结束处 ;R2=0,即z=1时,跳转到202E
5
计算机组成原理实验指导书
2027:PUSH R0 ;未完,保存R0的值到堆栈中,为了将状态字送入R0 2028:IN 81 ;查询接口状态,判字符串行输出完成否, 2029:SHR R0 202A:JRNC 2028 202B:POP R0 202C:INC R0 202D:JR 2024
;R0右移一位,将移出的一位送入状态位C ;未完成,则循环等待,C=0时跳转
;已完成,准备输出下一字符并从堆栈恢复R0的值 ;得到下一个要输出的字符 R0+1 ;转去输出字符, 无条件转移
202E:RET 202F:↙
该程序的执行码放在2020H起始的连续内存区中。若送入源码的过程中有错,系统会进行提示,等待重新输入正确的汇编语句。输入过程中,在应输入语句的位置直接打回车则结束输入过程。 <2>用“G”命令运行程序
在命令行提示符状态下输入:
G 2020↙
记录执行结果:
【思考题】当把IN 81,SHR R0,JNC 2028三条语句换成3个MVRR R0,R0语句,该程序执行过程会出现什么现象?试分析并实际执行一次。
类似的,若要求在终端屏幕上输出‘A’到‘Z’共26个英文字母,应如何修改例2中给出的程序?请验证之。将程序写入实验报告。
6
计算机组成原理实验指导书
例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
;用于判数字符的下界值,‘0’的ASCII码 ;用于判数字符的上界值,‘9’的ASCII码 ;判键盘上是否按了一个键
;即串行口是否有了输入的字符 ;没有输入则循环测试 ;输入字符到R0的低字节
; R0的高位字节内容清零(R0的高字节可能原来的值不;判输入字符≥字符‘0’否,R0-R2,置状态位C ;若为否,则转到程序结束处,C=0,跳转 ;判输入字符≤字符‘9’否 ;若为否,则转到程序结束处
MVRD R1,00FF AND R0,R1
为零)
CMP R0,R2 JRNC 2053
CMP R3,R0 JRNC 2053
OUT 80 ;输出刚输入的数字符 JMPA 2044 ;转去程序前边2044处等待输入下一个字符,无条件跳到2044
(2053)RET
<2>在命令行提示符状态下输入:
G 2040↙
光标闪烁等待键盘输入,若输入0~9十个数字符,则在屏幕上回显;若输入非数字符,则屏幕不再显示该字符,出现命令提示符,等待新命令。
【思考题】本程序中为什么不必判别串行口输出完成否?设计打入‘A’~‘Z’和‘0’~‘9’的程序,遇其它字符结束输入过程。运行通过后将程序写入实验报告。
7
计算机组成原理实验指导书
3)例4:计算1到10的累加和。
<1>在命令行提示符状态下输入:
A 2060↙ 屏幕将显示: 2060:
从地址2060H开始输入下列程序:
(2060)MVRD R1,0000 MVRD R3,0000
(2066)INC R3
ADD R1,R3
CMP R3,R2 JRNZ 2066
;置累加和的初值为0
MVRD R2,000A ;最大的加数
;得到下一个参加累加的数 ;累加计算
;判是否累加完,R3-R2,置状态位Z,R3-R2=0时,z=1 ;未完,开始下一轮累加z=0时跳转
RET
<2>在命令行提示符状态下输入:
G 2060↙
运行过后,可以用R命令观察寄存器的内容。结果为: R1=? R2=? R3=?
哪个寄存器的内容为累加和?R1
4)例5:设计一个有读写内存和子程序调用指令的程序,功能是读出内存中的字符,将其显示到显示器的屏幕上,转换为小写字母后再写回存储器原存储区域。 大写‘A’到‘Z’的ASCII码是41H~5AH 小写‘a’到‘z’的ASCII码是61H到7AH
<1>将被显示的6个字符‘A’~‘F’送入到内存20F0H开始的存储区域中。
在命令行提示符状态下输入: E 20F0↙ 屏幕将显示:
20F0 内存单元原值
按下列格式输入:
20F0 内存原值:0041 内存原值:0042 内存原值:0043 内存原值:0044 内存原值:0045 内存原值:0046↙ 在命令行提示符状态下输入: 从地址2080H开始输入下列程序:
(2080)MVRD R3,0006 ;指定被读数据的个数(6个)
MVRD R2,20F0 ;指定被读、写数据内存区首地址 (2084)LDRR R0,[R2]
CALA 2100
DEC R3 JRZ 208B INC R2 JR 2084
;读内存中的一个字符到R0寄存器
;调用地址为2100子程序,完成显示、转换并写回的功能 ;检查输出的字符个数,置状态位z,R3-1=0时,z=1 ;完成输出则结束程序的执行过程,z=1跳转
;未完成,修改内存地址R2+1→ R2
;转移到程序的2084处,循环执行规定的处理,无条件跳
8

