职场文秘网

首页 > 文秘写作 > 工商税务 / 正文

东北大学计算机组成原理课程设计报告

2020-12-30 10:57:54

 计算机组成原理课程设计报告 班级:计算机

 班

 姓名:

  学号:

 完成时间:

 一、课程设计目的 1.在实验机上设计实现机器指令及对应的微指令(微程序)并验证,从而进一步掌握微程序设计控制器的基本方法并了解指令系统与硬件结构的对应关系; 2.通过控制器的微程序设计,综合理解计算机组成原理课程的核心知识并进一步建立整机系统的概念; 3.培养综合实践及独立分析、解决问题的能力。

  二、课程设计的任务 针对COP2000实验仪,从详细了解该模型机的指令/微指令系统入手,以实现乘法和除法运算功能为应用目标,在COP2000的集成开发环境下,设计全新的指令系统并编写对应的微程序;之后编写实现乘法和除法的程序进行设计的验证。

  三、 课程设计使用的设备(环境) 1.硬件 l COP2000实验仪 l PC机 2.软件 l COP2000仿真软件

 四、课程设计的具体内容(步骤) 1.详细了解并掌握COP 2000模型机的微程序控制器原理,通过综合实验来实现 该模型机指令系统的特点:COP2000模型机的指令为8位,根据操作的内容,可以有0到2个操作数。每个操作数支持5种寻址方式,包括累加器A寻址,寄存器R0~R3寻址,寄存器R0~R3间接寻址,内存直接寻址以及立即数寻址。

 COP2000模型机指令的最低两位(IR0和IR1)用来寻址R0~R3四个寄存器;IR2和IR3与ELP微控制信号,Cy和Z两个程序状态信号配合,控制PC的置数即程序的转移。各种转移的条件判断逻辑如下所示:

 PC 置数逻辑

  当ELP=1时,不允许PC被预置

 当ELP=0时

  当IR3=1时,无论Cy和Z什么状态,PC被预置

 当IR3=0时

 若IR2=0,则当Cy=1时PC被预置

  若IR2=1,则当Z=1时PC被预置 本模型机时序控制采用不定长机器周期的同步控制方式,一条指令最多分四个节拍。

 系统提供的默认指令系统包括以下7类指令:

 算术运算指令:

 逻辑运算指令:

 数据传输指令:

 跳转指令:

 ADD A, R?

 ADD A, @R?

 ADD A, MM

 ADD A, #II

 ADDC A, R?

 ADDC A, @R?

 ADDC A, MM

 ADDC A, #II

 SUB A, R? SUB A, @R?

 SUB A, MM

 SUB A, #II

 SUBC A, R?

 SUBC A, @R?

 SUBC A, MM

 SUBC A, #II AND A, R?

 AND A, @R?

 AND A, MM

 AND A, #II

 OR A, R? OR A, @R?

 OR A, MM

 OR A, #II CPL A MOV A, R?

 MOV A, @R?

 MOV A, MM

 MOV A, #II

 MOV R?, A

 MOV @R?, A MOV MM, A

 MOV R?, #II JC MM

 JZ MM

  JMP MM CALL MM RET 移位指令:

 中断返回指令:

 输入/输出指令:

 RR A

 RL A

 RRC A

 RLC A RETI READ MM WRITE MM

 IN OUT

 该模型机微指令系统的特点(包括其微指令格式的说明等):

 COP2000 模型机的微指令字长为 24 位,全部为操作控制部分,不含顺序控制字段。微指令编码采用混合表示法,微地址形成采用计数器方式。微指令格式为水平型微指令。下面分别从为操作控制和顺序控制两方面进行说明:

 a. 微操作控制 24 位微操作控制信号含义如下表:

 表 1:COP2000 模型机 24 位微控制信号功能 控制信号 含义 XRD:

 外部设备读信号,当给出了外设的地址后,输出此信号,从指定外设读数据。

 EMWR:

 程序存储器 EM 写信号。

 EMRD:

 程序存储器 EM 读信号。

 PCOE:

 将程序计数器 PC 的值送到地址总线 ABUS 上。

 EMEN:

 将程序存储器 EM

 与数据总线 DBUS 接通,由 EMWR 和 EMRD 决定是将 DBUS 数据写到 EM 中,还是从 EM 读出数据送到 DBUS。

 IREN:

 将程序存储器 EM 读出的数据打入指令寄存器 IR 和微指令计数器 uPC。

 EINT:

 中断返回时清除中断响应和中断请求标志,便于下次中断。

 ELP:

 PC 打入允许,与指令寄存器的 IR3、IR2 位结合,控制程序跳转。

 MAREN:

 将数据总线 DBUS 上数据打入地址寄存器 MAR。

 MAROE:

 将地址寄存器 MAR 的值送到地址总线 ABUS 上。

 OUTEN:

 将数据总线 DBUS 上数据送到输出端口寄存器 OUT 里。

 STEN:

 将数据总线 DBUS 上数据存入堆栈寄存器 ST 中。

 RRD:

 读寄存器组 R0-R3,寄存器 R?的选择由指令的最低两位决定。

 RWR:

 写寄存器组 R0-R3,寄存器 R?的选择由指令的最低两位决定。

 CN:

 决定运算器是否带进位移位,CN=1 带进位,CN=0 不带进位。

 FEN:

 将标志位存入 ALU 内部的标志寄存器。

 X2 X1 X0: X2、X1、X0 三位组合来译码选择将数据送到 DBUS 上的寄存器。

  WEN:

 将数据总线 DBUS 的值打入工作寄存器 W 中。

 AEN:

 将数据总线 DBUS 的值打入累加器 A 中。

 S2 S1 S0 S2、S1、S0 三位组合决定 ALU 做何种运算。

  X2 X1 X0 被选中寄存器 S2 S1 S0 运算 000 IN 000 A+W 001 IA 001 A-W 010 ST 010 A OR W 011 PC 011 A AND W 100 D 100 A+W+Cy 101 R 101 A-W-Cy 110 L 110 NOT A 111 无 111 A

  b. 顺序控制 COP2000

 微程序控制器的微地址生成部件是一个计数器,分别控制该计数器的使能端(自动加一)和置数端(跳转至其他指令对应的位程序地址)生成微命令的地址。

 2。计算机中实现乘法和除法的原理 (1)无符号乘法 ①实例演示:

 1010×1011=1101110

  无符号乘法的实例演示如图1所示:

 1

 0

 1

 0 ×

 1

 0

 1

 1

  0

 0

 0

 0 +

 1

 0

 1

 0

  1

 0

 1

 0

 +

  1

 0

 1

 0

  1

 1

 1

 1

 0 +

 0

 0

 0

 0

  0

 1

 1

 1

 1

 0 + 1

 0

 1

 0

 (0) 1

 1

 0

 1

 1

 1

 0

 即:1001×0110=1101110

 ②硬件原理框图:

 被乘数(不变)

 0

 M3 M2

 M1

 M0

 0

 0

 0 ALU ADD

  ZF 控制逻辑 0 0 0 0 A3

  A2

  A1

 A0 SHR 乘数(部分和) 图 1:乘法硬件原理图

 ③算法流程图:

 (2)无符号除法 ①实例演示:

 无符号除法使用加减交替法,若余数为正,则下一步执行减法,商置1;反之商置0,下一步执行加法。

  0 1 1 1 1 0 1 1 - 1 1 0 1

 1 0 1 0 1 0 1 1 +

 1 1 0 1

  0 0 0 1 0 0 1 1 -

  1 1 0 1

 1 1 0 1 1 1 1 1 +

 1 1 0 1

  1 1 1 1 1 0 0 1 +

  1 1 0 1

 0 0 0 0 0 1 1 0 123÷13商为9,余数为6

 ②硬件原理框图:

  被除数(部分余数+商) D7

  D6

 D5 D4 D3

 D2

 D1

 D0 ALU ZF ADD SUB 控制逻辑 A3

 A2

 A1

 A0

  0 0 0 0

 除数 SHR

 ③算法流程图:

  3.对应于以上算法如何分配使用COP2000实验仪中的硬件 由于循环控制运算时会占用累加器 A,因此参与运算的操作数均应保存在通用寄存器 R0~R3 中。资源分配如下:

 直接乘法:

 R0:中间结果及最终结果

 R1:被乘数(每次运算左移 1 位)

 R2:乘数(每次运算右移 1 位) 加减交替除法:

 R0:被除数(部分余数,最终得到余数)

  R1:除数(初始化时左移 4 位,每次计算时右移1位)

  R2:商(低 4 位)

  R3:计数器 4.在COP2000集成开发环境下设计全新的指令/微指令系统 设计结果如表所示(可按需要增删表项) (1) 新的指令集 (设计两个不同指令集要分别列表)

 助记符 机器码1 机器码2 指令说明 _FATCH_ 000000XX

 00-03

 实验机占用,不可修改。复位后,所有寄存器清0,首先执行 _FATCH_ 指令取指。

 ADD R?,#II 000001XX

 04-07 II R?←R?+立即数 II ADD R?,A 000010XX

 08-0B

 R?←A+R? SUB R?,#II 000011XX

 0C-0F II R?←R?-立即数II SUB R?,A 000100XX

 10-13

 R?←R?-A MOV R?,#II 000101XX

 14-17

 R?←R? MOV A, R? 000110XX

 18-1B

 A←R? SHL R? 000111XX

 1C-1F3

 R?不带进位左移 1 位 SHR R? 001000XX

 20-23

 R?不带进位右移 1 位 PUSH A 001001XX

 24-27

 A压栈 POP A 001010XX

 28-2B

 将栈顶元素值给A MOV R?,A 001011XX

 2C-2F

 R?←A AND A,#II 001100XX

 30-33 II A与立即数 II进行与运算 JZ

 MM 001101XX

 34-37 MM ZF=1 时跳转 JMP MM 001111XX

 3C-3F MM 跳转 JC

 MM 010000XX

 40-43 MM CF=1 时跳转

 (2) 新的微指令集

  5.用设计完成的新指令集编写实现无符号二进制乘法、除法功能的汇编语言程序 (1)乘法

 MOV R0,#00H

 MOV R1,#09H

 MOV R2,#09H LOOP1: SUB R2,#00H

 JZ LOOP3

 MOV A,R2

 AND A,#01H

 JZ LOOP2

 MOV A,R1

 ADD R0,A LOOP2: SHL R1

 SHR R2

 JMP LOOP1 LOOP3: END (2)除法

 MOV R0,#86H

 MOV R1,#09H

 MOV R2,#00H

 MOV R3,#05H

 MOV A,R1

 AND A,#0FFH

 JZ LOOP3

 SHL R1

 SHL R1

 SHL R1

 SHL R1

 MOV A,R0

 PUSH A

 MOV A,R1

 SUB R0,A

 JC LOOP1

 JMP LOOP3 LOOP1: POP A

 MOV R0,A

 SHL R2

 SHR R1

 SUB R3,#01H

 JZ LOOP4

 MOV A,R0

 PUSH A

 MOV A,R1

 SUB R0,A

 JC LOOP1 LOOP2: SHL R2

 SHR R1

 ADD R2,#01H

 SUB R3,#01H

 JZ LOOP4

 MOV A,R0

 PUSH A

 MOV A,R1

 SUB R0,A

 JC LOOP1

 JMP LOOP2 LOOP3: MOV R2,#0FFH LOOP4: END 6.上述程序的运行情况(跟踪结果) 程序运行的过程 乘法 汇 编 指 令 程序地址 机器码 指令说明 微程序 PC mPC 运行时寄存器或存储器的值 _FATCH_ 00 00 实验机占用,不可修改。复位后,所有寄存器清0,首先执行 _FATCH_ 指令取指。

 CBFFFF +1 写入 EM:14 MOV R0,#00 00 1400 将立即数00H存放到寄存器R0中。

 C7FBFF CBFFFF +1 +1 +1 写入 EM:14 EM:00

 R0:00 MOV R1,#09 02 1509 将立即数09H存放到寄存器R1中。

 C7FBFF CBFFFF +1 +1 +1 写入 EM:15 EM:09

 R1:09 MOV R2,#09 04 1609 将立即数09H存放到寄存器R2中。

 C7FBFF CBFFFF +1 +1 +1 写入 EM:16 EM:09

 R2:09 SUB R2,#00 06 0E00 寄存器R2减去立即数00H后存入寄存器R2中,改变标志位 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1

 +1 +1 +1 +1 写入 EM:0E EM:0E

 A:09 EM:00 EM:00 JZ

 15 08 3415 若零标志位置1,跳转到15H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:34 EM:15 MOV A,R2 0A 1A 将累加器A中的数存放到寄存器R2中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM:1A EM:1A

 W:09 AND A,#01 0B 3001 累加器A中的数与立即数01H做与运算,结果存入累加器A中 C7FFEF FFFE93 CBFFFF +1

 +1 +1 +1 写入 EM:30 EM:01 EM:01

 A=01 JZ

 11 0D 3411 若零标志位置1,跳转到11H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:34 EM:11 MOV A,R1 0F 19 将累加器A中的数存放到寄存器R1中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM:19 EM:19

 A:09 ADD R0,A 10 08 寄存器R0中的值加上累加器A中的值,结果存入寄存器R0中 FFF7EF FFFA98 CBFFFF

  +1 +1 +1 写入 EM:08 EM:08

 W=00 EM:01

 R0=09 SHL

 R1 11 1D 寄存器R1中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM:1D EM:1D

 A:09 EM:1D

 R1:12 SHR

 R2 12 22 寄存器R2中的数不带进位向右移一位,并不影响标志位。

 FFF7F7 FFF9BF CBFFFF

  +1 +1 +1 写入 EM:22 EM:22

 A:09 EM:22

 R2:04 JMP

 06 13 3C06 跳转到06H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:3C EM:06 SUB R2,#00 06 0E00 寄存器R2减去立即数00H后存入寄存器R2中,改变标志位 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1

 +1 +1 +1 +1 写入 EM:0E EM:0E

 W:04 EM:00 EM:00 JZ

 15 08 3415 若零标志位置1,跳转到15H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:34 EM:15 MOV A,R2 0A 1A 将累加器A中的数存放到寄存器R2中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM:1A EM:1A

 A=04 AND A,#01 0B 3001 累加器A中的数与立即数01H做与运算,结果存入累加器A中 C7FFEF FFFE93 CBFFFF +1

 +1 +1 +1 写入 EM:30 EM:01

 W:01 EM:01

 A:00 JZ

 11 0D 3411 若零标志位置1,跳转到11H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:34 EM:11 SHL

 R1 11 1D 寄存器R1中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM:1D EM:1D

 A:12 EM:1D

 R1:24 SHR

 R2 12 22 寄存器R2中的数不带进位向右移一位,并不影响标志位。

 FFF7F7 FFF9BF CBFFFF

  +1 +1 +1 写入 EM:22 EM:22

 A:04 EM:22

 R2:02 JMP

 06 13 3C06 跳转到06H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:3C EM:06 SUB R2,#00 06 0E00 寄存器R2减去立即数00H后存入寄存器R2中,改变标志位 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1

 +1 +1 +1 +1 写入 EM:0E EM:0E

 A:02 EM:00

 W:00 EM:00 JZ

 15 08 3415 若零标志位置1,跳转到15H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:34 EM:15 MOV A,R2 0A 1A

 FFF7F7 CBFFFF

 +1 +1 写入 EM:1A EM:1A

 A=02 AND A,#01 0B 3001 寄存器R2与立即数01H,只改变标志位,并不改变R2中的数值。

 C7FFEF FFFE93 CBFFFF

 +1

 +1 +1 +1 写入 EM:30 EM:01

 W:01 EM:01

 A:00 JZ

 11 0D 3411 若零标志位置1,跳转到11H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:34 EM:11 SHL

 R1 11 1D 寄存器R1中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM:1D EM:1D

 A:24 EM:1D

 R1:48 SHR

 R2 12 22 寄存器R2中的数不带进位向右移一位,并不影响标志位。

 FFF7F7 FFF9BF CBFFFF

  +1 +1 +1 写入 EM:22 EM:22

 A:02 EM:22

 R2:01 JMP

 06 13 3C06 跳转到06H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:3C EM:06 SUB R2,#00 06 0E00 寄存器R2减去立即数00H后存入寄存器R2中,改变标志位 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1

 +1 +1 +1 +1 写入 EM:0E EM:0E

 A:01 EM:00

 W:00 EM:00 JZ

 15 08 3415 若零标志位置1,跳转到15H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:34 EM:15 MOV A,R2 0A 1A

 FFF7F7 CBFFFF

 +1 +1 写入 EM:1A EM:1A

 A=01 AND A,#01 0B 3001 寄存器R2与立即数01H,只改变标志位,并不改变R2中的数值。

 C7FFEF FFFE93 CBFFFF

 +1

 +1 写入 +1 +1 写入 +1 EM:30 EM:01

 W:01 EM:01

 A:01 EM:01 JZ

 11 0D 3411 若零标志位置1,跳转到11H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:34 EM:11 MOV A,R1 0F 19 将累加器A中的数存放到寄存器R1中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM:19 EM:19

 A=48 ADD R0,A 10 08 寄存器R0中的值加上累加器A中的值,结果存入寄存器R0中 FFF7EF FFFA98 CBFFFF

  +1 +1 +1 写入 EM:08 EM:08

 W:09 EM:08

 R0:51 SHL

 R1 11 1D 寄存器R1中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM:1D EM:1D

 A:48 EM:1D

 R1:90 SHR

 R2 12 22 寄存器R2中的数不带进位向右移一位,并不影响标志位。

 FFF7F7 FFF9BF CBFFFF

  +1 +1 +1 写入 EM:22 EM:22

 A:01 EM:22

 R2:00 JMP

 06 13 3C06 跳转到06H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:3C EM:06 SUB R2,#00 06 0E00 寄存器R2减去立即数00H后存入寄存器R2中,改变标志位 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1

 +1 +1 +1 +1 写入 EM:0E EM:0E

 A:00 EM:00

 W:00 EM:00 JZ

 15 08 3415 若零标志位置1,跳转到15H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM:34 EM:15 _FATCH_ 00 00 实验机占用,不可修改。复位后,所有寄存器清0,首先执行 _FATCH_ 指令取指。

 CBFFFF +1 写入 EM:00

 除法:

 汇 编 指 令 程序地址 机器码 指令说明 微程序 PC

  mPC 运行时寄存器或存储器的值 _FATCH 00 0 实验机占用,不可修改。复位后,所有寄存器清0,首先执行 _FATCH_ 指令取指。

 CBFFFF

 +1 写入 EM=14 MOV R0,#86H 00 1486 将立即数86H存放到寄存器R0中。

 C7FBFF CBFFFF +1 +1 +1 写入 EM=14 EM=86 R0=86 MOV R1,#09H 02 1509 将立即数09H存放到寄存器R1中。

 C7FBFF CBFFFF +1 +1 +1 写入 EM=15 EM=09 R1=09 MOV R2,#00H 04 1600 将立即数00H存放到寄存器R2中。

 C7FBFF CBFFFF +1 +1 +1 写入 EM=16 EM=00 R2=00 MOV R3,#05H 06 1705 将立即数05H存放到寄存器R3中。

 C7FBFF CBFFFF +1 +1 +1 写入 EM=17 EM=05 R3=05 MOV A,R1 08 19 将寄存器R1的数存入累加器A中 FFF7F7 CBFFFF

 +1 +1 写入 EM=19 EM=19 A=09 AND A,#FF 09 30FF 累加器A中的数和立即数FFH作与运算结果存入累加器A中 C7FFEF FFFE93 CBFFFF +1

 +1 +1 +1 写入 EM=30 EM=FF W=FF EM=FF W=FF JZ 37 0B 3437 若零标志位置1,跳转到37H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=34 EM=37 SHL R1 0D 1D 寄存器R1中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM=1D EM=1D EM=1D R1=12 SHL R1 0E 1D 寄存器R1中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM=1D EM=1D A=12 EM=1D R1=24 SHL R1 0F 1D 寄存器R1中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM=1D EM=1D A=24 EM=1D R1=48 SHL R1 10 1D 寄存器R1中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM=1D EM=1D A=48 EM=1D R1=90 MOV A,R0 11 18 将寄存器R0中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=18 EM=18 A=86 PUSH A 12 24 将累加器A中的数据压入堆栈寄存器ST。

 FFEF9F CBFFFF

 +1 +1 写入 EM=24 EM=24 ST=86 MOV A,R1 13 19 将寄存器R1中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=19 EM=19 A=90 SUB R0,A 14 10 从寄存器R0中减去累加器A中的数,并影响标志位。

 FFFF8F FFF7F7 FFFA99 CBFFFF

 +1 +1 +1 +1 写入 EM=10 EM=10 W=90 EM=10 EM=10 R0=F6 JC 19 15 4019 若进位标志位置1,跳转到19H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=40 EM=40 PC=19 POP A 19 28 将堆栈寄存器ST的栈顶数据赋给累加器A。

 FFFF57 CBFFFF

 +1 +1 写入 EM=28 EM=28 A=86 MOV R0,A 1A 2C 将累加器A中的数放入寄存器R0中。

 FFFB9F CBFFFF

 +1 +1 写入 EM=2C EM=2C R0=86 SHL R2 1B 1E 寄存器R2中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM=1E EM=1E A=00 EM=1E SHR R1 1C 21 寄存器R1中的数不带进位向右移一位,并不影响标志位。

 FFF7F7 FFF9BF CBFFFF

  +1 +1 +1 写入 EM=21 EM=21 A=90 EM=21 R1=48 SUB R3,#01H 1D 0F01 从寄存器R3中减去立即数01H,并影响标志位。

 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1 +1 +1 +1 +1 写入 EM=0F EM=0F A=05 EM=01 EM=01 R3=04 JZ 39 1F 3489 若零标志位置1,跳转到39H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=34 EM=39 MOV A,R0 21 18 将寄存器R0中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=18 EM=1D A=86 PUSH A 22 24 将累加器A中的数据压入堆栈寄存器ST。

 FFEF9F CBFFFF

 +1 +1 写入 EM=24 EM=24 ST=86 MOV A,R1 23 19 将寄存器R1中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=19 EM=19 A=48 SUB R0,A 24 10 从寄存器R0中减去累加器A中的数,并影响标志位。

 FFFF8F FFF7F7 FFFA99 CBFFFF

 +1 +1 +1 +1 写入 EM=10 EM=10 W=48 EM=10 A=86 EM=10 R0=3E JC 19 25 4019 若进位标志位置1,跳转到19H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=40 EM=19 SHL R2 27 1E 寄存器R2中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM=1E EM=1E A=00 EM=1E SHR R1 28 21 寄存器R1中的数不带进位向右移一位,并不影响标志位。

 FFF7F7 FFF9BF CBFFFF

  +1 +1 +1 写入 EM=21 EM=21 A=48 EM=21 R1=24 ADD R2,#01H 29 0601 将立即数01H加入到寄存器R2中,并影响标志位。

 FFF7F7 C7FFEF FFFA98 CBFFFF

 +1

 +1 写入 +1 +1 +1 EM=06 EM=06 A=00 EM=01 EM=01 R2=01 SUB R3,#01H 2B 0F01 从寄存器R3中减去立即数01H,并影响标志位。

 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1 +1 +1 +1 +1 写入 EM=0F EM=0F A=04 EM=01 EM=01 R3=03 JZ 39 2D 3439 若零标志位置1,跳转到39H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=34 EM=39 MOV A,R0 2F 18 将寄存器R0中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=18 EM=18 A=3E PUSH A 30 24 将累加器A中的数据压入堆栈寄存器ST。

 FFEF9F CBFFFF

 +1 +1 写入 EM=24 EM=24 ST=3E MOV A,R1 31 19 将寄存器R1中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=19 EM=19 A=24 SUB R0,A 32 10 从寄存器R0中减去累加器A中的数,并影响标志位。

 FFFF8F FFF7F7 FFFA99 CBFFFF

 +1 +1 +1 +1 写入 EM=10 EM=10 W=24 EM=10 A=3E EM=10 R0=1A JC 19 33 4019 若进位标志位置1,跳转到19H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=40 EM=19 JMP 27 35 3C27 跳转到27H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=3C EM=27 SHL R2 27 1E 寄存器R2中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM=1E EM=1E A=01 EM=1E R2=02 SHR R1 28 21 寄存器R1中的数不带进位向右移一位,并不影响标志位。

 FFF7F7 FFF9BF CBFFFF

  +1 +1 +1 写入 EM=21 EM=21 A=24 EM=21 R1=12 ADD R2,#01 29 0601 将立即数01H加入到寄存器R2中,并影响标志位。

 FFF7F7 C7FFEF FFFA98 CBFFFF

 +1

 +1 +1 +1 +1 写入 EM=06 EM=06 A=02 EM=01 W=01 EM=01 R2=03 SUB R3.#01 2B 0F01 从寄存器R3中减去立即数01H,并影响标志位。

 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1 +1 +1 +1 +1 写入 EM=0F EM=0F A=03 EM=01 EM=01 R3=02 JZ 39 2D 3439 若零标志位置1,跳转到39H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=34 EM=39 MOV A,R0 2F 18 将寄存器R0中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=18 EM=18 A=1A PUSH A 30 24 将累加器A中的数据压入堆栈寄存器ST。

 FFEF9F CBFFFF

 +1 +1 写入 EM=24 EM=24 ST=1A MOV A,R1 31 19 将寄存器R1中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=19 EM=19 A=12 SUB R0,A 32 10 从寄存器R0中减去累加器A中的数,并影响标志位。

 FFFF8F FFF7F7 FFFA99 CBFFFF

 +1 +1 +1 +1 写入 EM=10 EM=10 W=12 EM=10 A=1A EM=10 R0=08 JC 19 33 4019 若进位标志位置1,跳转到19H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=40 EM=19 JMP 27 35 3C27 跳转到27H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=3C EM=27 SHL R2 27 1E 寄存器R2中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 +1 +1 写入 EM=1E EM=1E A=03 EM=1E R2=06 SHR R1 28 21 寄存器R1中的数不带进位向右移一位,并不影响标志位。

 FFF7F7 FFF9BF CBFFFF

  +1 +1 +1 写入 EM=21 EM=21 A=12 EM=21 R1=09 ADD R2,#01 29 0601 将立即数01H加入到寄存器R2中,并影响标志位。

 FFF7F7 C7FFEF FFFA98 CBFFFF

 +1

 +1 +1 +1 +1 写入 EM=06 EM=06 A=06 EM=01 W=01 EM=01 R2=07 SUB R3,#01 2B 0F01 从寄存器R3中减去立即数01H,并影响标志位。

 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1 +1 +1 +1 +1 写入 EM=0F EM=0F A=02 EM=01 EM=01 R3=01 JZ 39 2D 3439 若零标志位置1,跳转到39H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=34 EM=39 MOV A,R0 2F 18 将寄存器R0中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=18 EM=18 A=08 PUSH A 30 24 将累加器A中的数据压入堆栈寄存器ST。

 FFEF9F CBFFFF

 +1 +1 写入 EM=24 EM=24 ST=08 MOV A,R1 31 19 将寄存器R1中的数放入累加器A中。

 FFF7F7 CBFFFF

 +1 +1 写入 EM=19 EM=19 A=09 SUB RO,A 32 10 从寄存器R0中减去累加器A中的数,并影响标志位。

 FFFF8F FFF7F7 FFFA99 CBFFFF

 +1 +1 +1 +1 写入 EM=10 EM=10 W=09 EM=10 A=08 EM=10 R0=FF JC 19 33 4019 若进位标志位置1,跳转到19H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=40 EM=19 POP A 35 28 将堆栈寄存器ST的栈顶数据赋给累加器A。

 FFFF57 CBFFFF

 +1 +1 写入 EM=28 EM=28 A=08 MOV R0,A 1A 2C 将累加器A中的数放入寄存器R0中。

 FFFB9F CBFFFF

 +1 +1 写入 EM=2C EM=2C R0=08 SHL R2 27 1E 寄存器R2中的数不带进位向左移一位,并不影响标志位。

 FFF7F7 FFF9DF CBFFFF

  +1 写入 +1 +1 EM=1E EM=1E A=07 EM=1E R2=0E SHR R1 28 21 寄存器R1中的数不带进位向右移一位,并不影响标志位。

 FFF7F7 FFF9BF CBFFFF

  +1 写入 +1 +1 EM=21 EM=21 A=09 EM=21 R1=04 SUB R3,#01 2B 0F01 从寄存器R3中减去立即数01H,并影响标志位。

 FFF7F7 C7FFEF FFFA99 CBFFFF

 +1

 +1 +1 +1 +1 写入 EM=0F EM=0F A=01 EM=01 EM=01 R3=00 JZ 39 1F 3439 若零标志位置1,跳转到39H地址。

 C6FFFF CBFFFF 写入 +1 +1 写入 EM=34 EM=39 _FATCH 00 00 实验机占用,不可修改。复位后,所有寄存器清0,首先执行 _FATCH_ 指令取指。

 CBFFFF +1 写入 EM=00

 7.设计结果说明 1)、最先调试时JMP,JC,JZ这些转移指令全部无效,仔细检查微程序没发现有错误,经查阅资料发现这几个指令的机器码1的第五位和第六位必须对应(JMP—11,JC—00,JZ—01)。

 2)、本来我是先设计指令系统,但是我发现我设计的指令太繁琐,而且无法估计到底用到哪些指令,最后我放弃先设计指令系统,先写完汇编程序再设计指令系统。

 3)、在写除法汇编程序的时候当减掉比被除数(中间结果)更大的余数时,在后面只是简单的加上余数是无法还原被除数(中间结果)。用一个堆栈,在减余数的之前将被除数(中间结果)压进栈,当余数大于被除数(中间结果)时,减了以后将栈顶元素值赋给被除数(中间结果)。

 4)、本来设计了一条“SUB R1,R2”这样的指令。但是在写指令对应的微指令时,发现这条指令在这个模型机里无法实现。因为在指令中不能同时出现两个操作数都是寄存器R?。最后我将寄存器R2的值送到累加器A中,然后设计“SUB R1,A”指令。

 五、本次课程设计的总结体会(不少于200字) 通过本次课程设计,我巩固了所学的《计算机组成原理》中有关指令系统、总线系统等方面的知识,进一步加深了对COP2000实验仪的使用方法的了解,能够更加熟练的使用COP2000实验仪,同时还让我复习并运用了算法设计与分析和汇编语言的内容。通过这次课程设计,既锻炼了我的动手能力,又锻炼了我的动脑能力,使我理论联系实际,使所学的知识不再枯燥无味,将所学的知识运用到实际,让我掌握这些知识更牢固。在查找资料的同时也锻炼了自己的自学能力,还提高了获取有用信息的能力。

 本次课程设计对我来说是一次很好的实践机会,让我能够过活学活用知识,在实践中加深对所学课程的理解,同时加强了我的动手能力,让我充分认识到了实践的重要性。在今后的学习和工作中,我要更多注重提高自己的动手能力,在实践中学习更多的知识。

 扩展:

 1.无符号8位乘8位 (1)初始化以及输入乘数与被乘数 首先是将部分积初始化送到寄存器R0中,乘数放入R1,被乘数放入R2。直接进行到地址LOOP部分。

  (2)运算过程

  首先从乘数最低位开始判断,将R1放于寄存器A中并和立即数#01H相与,此时可以判断乘数最低位是0或1。基于语句JZ NEXT,当前面的判断结果是0,跳转到地址NEXT;否则顺序执行程序。

 跳转到NEXT,即当程序乘数最低位为0时,将R0不变;顺序执行程序,即当乘数最低位为1时,将R0与R2相加,判断最低位是0还是1,当判断结果是0,跳转到NEXT1,否则顺序执行程序,所得到的结果送到寄存器R0中,存入数据后无条件跳转到NEXT2,判断是否是最后一位。

 然后进行移位操作。在移位前需要考虑R0的最低位是0或1,因为部分积移到的数值也是结果的部分,就是保存在结果低位的部分,也就是寄存器R1中,所以要保留移掉部分,此时判断R0最低位。利用语句JZ NEXT1,当前面的判断结果是0,标志位为1,跳转到地址NEXT1;否则顺序执行程序。

  当部分积最低位是1时,右移R0,进行保存;当部分积最低位是0时,右移R0、R1,进行保存。

 每次循环结束都要进入结果输出部分JZ NEXT3。

 (3)显示乘积的结果 最后循环控制程序结束。因为乘法的结果是16位,而此时16位结果的高八位存放在R0,低八位存放于R1。显示结果为R0显示的数据加上R1显示的数据 开 始 乘数最低位为1R1 Y N 部分积与被乘数相加 部分积不变

 部分积最低位为1? N Y 部分积右移 乘数右移并加10000000 部分积右移 乘数右移 将部分积右移八次加上乘数寄存器里的数,得到乘积结果

 循环结束? N Y 结 束 输入部分积、乘数和被乘数 结果输出

 判断乘数末位是否为1,应用MOV A,R1和AND A,#01语句,将乘数与1相与,得出末位结果。然后利用JZ

 NEXT,如果结果是0,则跳转到地址NEXT;否则顺序执行程序。

 (1)NEXT,即当乘数最低位为0时,R0不变; (2)顺序执行程序,即当乘数最低位为1时,将R0与R2相加,所得到的结果送到寄存器R0中。

 在移位前需要考虑R0的最低位是0或1,因为部分积移到的数值也是结果的部分,就是保存在结果低位的部分,也就是寄存器R1中,所以要保留移掉部分,此时判断R0最低位。先应用MOV A,R0和AND A,#01,将部分积与1相与,得出末位结果。

 利用JZ NEXT1,当前面的结果是0,跳转到地址NEXT1;否则顺序执行程序。

  当部分积最低位是1时,右移R0,右移R1加10000000,进行保存;当部分积最低位是0时,右移R0、R1,进行保存。

 开 始 乘数最低位为1? Y N

 部分积与被乘数相加 部分积不变

 部分积最低位为1? N Y 部分积右移 乘数右移并加10000000 部分积右移 乘数右移 结 束

 汇编代码:

 MOV

 R0,#00H MOV

 R1,#32H MOV

 R2,#95H MOV

 R3,#08H LOOP: MOV

 A,R1 AND

 A,#01H JZ

 NEXT MOV

 A,R0 ADD

 A,R2 MOV

 R0,A AND

 A,#01H JZ

 NEXT1 MOV

 A,R0 RR

 A MOV

 R0,A MOV

 A,R1 RR

 A OR

 A,#80H MOV

 R1,A JMP

 NEXT2 NEXT1: MOV

 A,R0 RR

 A MOV

 R0,A MOV

 A,R1 RR

 A MOV

 R1,A JMP

 NEXT2 NEXT: MOV

 A,R0 AND

 A,#01H JZ

 NEXT1 MOV

 A,R0 RR

 A MOV

 R0,A MOV

 A,R1 RR

 A OR

 A,#80H MOV

 R1,A JMP

 NEXT2 NEXT2: MOV

 A,R3 SUB

 A,#01H OR

 A,#00H JZ

 NEXT3 MOV

 R3,A JMP

 LOOP NEXT3:JMP NEXT3

 补码运算:

 采用伟福COP2000试验箱,设计并实现定点补码一位乘(booth)。

 要求:采用的算法为定点补码一位乘booth算法,乘数和被乘数规定为6位,其中首位为符号位。数据要求以原码的形式输入,采用补码方式进行运算。实验数据从试验箱的开关输入,运算的结果在OUT寄存器中显示。

 设计原理:比较YnYn+1的状态执行相应的操作。如下图是补码一位乘的运算规则:

 表1.1

 Booth算法操作表说明 乘数Yn 附加位Yn+1 说明 0 0 附加位、乘数、部分积→1位 0 1 部分积加[X]补 附加位、乘数、部分积→1位 1 0 部分积加[-X]补 附加位、乘数、部分积→1位 1 1 附加位、乘数、部分积→1位 需要说明的是此操作表是在当n≠0时,当n=0时,判断YnYn+1,运算规则同此操作表只是不移位。即在运算的最后一步,乘积不再右移。

 设计思路:

 (1) 构造补码一位乘的初始化所需要的数值 因为补码一位乘的算法需要先求出[X]补、[-X]补、[Q]补,所以先将[X]补、[-X]补、[Q]补分别存贮到0F0H到0F2H存储单元中。因为部分积和附加位的初始值都是0,所以在0E0H单元存入附加位初始值0,在R0中存入部分积初始值0。

 其他数的处理:将输入的一个值Q求出补码作为乘数Y,并存入R2中;另一个值X存入R1中,根据它来求出[X]补、[-X]补; 本实验规定乘数和被乘数为8位,数据位为7位,所以要完成7次操作,但最后一次不移位,在R3寄存中存入数值n=7,每次操作完成后减1。

 (2)运算并输出

 根据乘数末位及附加位来确定执行的操作,每完成一次操作R3中的数值减一。判断R3的数值是否为零,若不为零,则继续循环上述操作,若为零,则循环结束,判断此时的乘数末位及附加位,再按运算规则进行一次操作,但是不移位,然后结束运算。即开始时Yn+1=0,部分积初值为0,每一步乘法由YnYn+1决定原部分积加 [X]补或加 [-X]补或加0,再右移一位得到新的部分积,以此重复n步,第n+1步由YnYn+1决定部分积加[X]补或加 [-X]补或加0,但不移位,即得最后结果,最后先把乘数的最终结果从OUT寄存其中显示出来,再将部分积的最终结果从OUT寄存其中显示出来。

 (3)实现方式 在掌握COP2000试验箱的体系结构后,充分利用试验箱提供的汇编语言,以及有限的硬件资源,完成程序的编写。

  1)算术逻辑运算指令 ADD

  A, R? -----------将寄存器R?的值加入累加器A中 ADD

  A,#II ----------立即数II加入累加器A中 SUB

  A,#II-----------从累加器中减去立即数II后加入累加器A中 AND

  A,R?------------累加器A“与”寄存器R?的值 AND

  A,#II ----------累加器A“与”立即数II的值 OR

 A, R? -----------累加器A“与”寄存器R?的值 OR

 A, #II ----------累加器A“与”立即数II的值 CPL

  A----------------累加器A取反,再存入累加器A中 (2)数据传送指令 MOV

  A,R?------------将寄存器R?的值送到累加器A中 MOV

  A, #II -----------将立即数II送到累加器A中 MOV

  R?,A------------将累加器A中的值送到寄存器R?中 MOV

  R?,#II----------将立即数II送到寄存器R?中 RR

  A-----------------累加器右移指令 RL

  A-----------------累加器左移指令 (3)跳转指令 JZ

 MM---------------若零标志位置1,跳转到MM地址 JMP

  MM---------------跳转到MM地址 流程图:

 根据运算规则循环相乘 判断乘数末位和附加位YnYn+1,根据运算规则进行循环,其中移位时附加位要与乘数末位保持一致,乘数的首位要与部分积的末位保持一致,部分积移位后的首位要与移位前的首位一致,并且根据数据位的个数决定循环几次。流程图如图2.2:

  图2.2

 循环相乘流程图 具体说明:乘法开始后,先将Y与01H进行“与”运算,判断Yn的末位,再将附加位与01H进行“与”运算,判断附加位的末位Yn+1,根据Yn和附加位Yn+1的状态决定部分积与被乘数相加还是相减,或是不加也不减,然后根据进行算术移位。

 移位操作需要先判断乘数Y的末位,如果Yn为1,则附加位为1,反之为0,将乘数右移一位,在判断部分积的末位,若部分积末位为0,将移位后的乘数首位置0,反之置1,再判断部分积首位为1,移位后的部分积首位仍置1,移位的操作流程图如图2.3:

  汇编代码:

 ; r3 循环次数 MOV

 A,#07H MOV

 R3,A ; r0=0 部分积初始化 MOV

 A,#00H MOV

 R0,A MOV

 0E0H,A ;input to r1 MOV A,#72H;;INPUT x to r1 MOV

 R1,A ; and with 20h AND

 A,#10000000B ;judge the sign JZ

 STATE1 ;+ cpl add 21h STATE20: MOV

 A,R1 CPL

  A ADD

 A,#81H MOV 0F0H,A ;now A is buma ;calc the -R1 buma ;because the r1 is>0 STATE21: MOV

 A,R1 AND

 A,#7FH MOV

 0F1H,A JMP

  STATE2 ;if r1>0 STATE1:MOV

 A,R1 MOV

 0F0H,A STATE22: CPL

  A ADD

 A,#01H MOV

 0F1H,A STATE2:;input y MOV

 A,#0FBH MOV

 R2,A ;and with 20H AND

 A,#10000000B ;if r2>0 jmp to day3 JZ

  STATE3 ;if r2<0 STATE23: MOV

 A,R2 CPL

  A ADD

 A,#81H MOV

 0F2H,A JMP

  STATE0 ;r2>0 mov 0f2h,r2 STATE3:MOV

 A,R2 MOV

 0F2H,A

 STATE0: ;part1 judge Y last is 1? MOV

 A,0F2H AND

 A,#000001B ;if y last

 is 0 jmp to day4 JZ

 STATE4 ;no judge addtional bit STATE24: MOV

 A,0E0H AND

 A,#000001B JZ

 STATE5 STATE6:MOV

 A,0F2H AND

 A,#000001B JZ

 STATE7 STATE26: MOV

 A,0E0H ;DEBUG OR

  A,#01H MOV

 0E0H,A LOOP:MOV

 A,0F2H RR

 A MOV

 0F2H,A STATE27: MOV

 A,R0 AND

 A,#000001B JZ

 STATE8 STATE28: MOV

 A,0F2H OR

 A,#80H MOV

 0F2H,A LOOP1:MOV

 A,R0 RR

 A MOV

 R0,A; AND

  A,#01000000B JZ

  STATE9 STATE29: MOV

  A,R0 OR

  A,#80H MOV

  R0,A JMP

 STATE10 STATE7:MOV

  A,0E0H AND

  A,#00H MOV

  0E0H,A JMP

 LOOP STATE8:MOV

  A,0F2H AND A,#7FH MOV

  0F2H,A JMP

 LOOP1 STATE9:MOV

  A,R0 AND

 A,#7FH MOV

  R0,A JMP

 STATE10 STATE5:MOV

  A,0F1H ADD

  A,R0 MOV

  R0,A JMP

 STATE6 ;y last is 0 ;judge 部分积末尾 STATE4:MOV

  A,0E0H AND

  A,#000001B ; if last is 0 jmp to day6 JZ

  STATE6 STATE25: MOV

  A ,0F0H ADD

  A,R0 MOV

  R0,A JMP

 STATE6

 ;judge r3 if r3 is 0 end output STATE10:MOV

 A,R3 SUB

 A,#000001B MOV

 R3,A OR

 A,#000000B JZ

  STATE11 JMP

  STATE0

 STATE11:MOV

  A,0F2H AND

 A,#000001B JZ

  STATE12 STATE30: MOV

 A,0E0H AND

 A,#000001B JZ

  STATE13 LOOP2:;MOV

  A,0F2H ;MOV R1,A MOV A,0F2H RR A MOV R1,A MOV A,R0 AND A,#01H JZ

 NEXT1 MOV A,R1 ADD A,#01H MOV R1,A MOV A,R0 RR A MOV R0,A JMP NEXT NEXT1: MOV A,R0 RR A MOV R0,A NEXT:JMP NEXT STATE13:MOV

  A,0F1H ADD

  A,R0 MOV

 R0,A JMP

  LOOP2 STATE12:MOV

  A,0E0H AND

 A,#000001B JZ

 LOOP2 MOV

  A,0F0H ADD

  A,R0 MOV

  R0,A JMP

 LOOP2

Tags: 大学计算机   课程设计   原理  

搜索
网站分类
标签列表