在复杂模型机上编写机器指令与微程序计算海伦公式——计算机组成原理课程设计
一、实验内容
1. 实验目的
综合运用所学计算机组成原理知识,设计并实现较为完整的计算机。
2. 实验目标
在充分理解复杂模型机原理的基础上,自行编写机器指令及其对应的微程序,达到使用复杂模型机计算海伦公式的目标。
3.实验设备
PC机一台,TD-CMA实验系统一套。
二、实验原理
1)数据格式
此次使用的模型机规定采用定点补码表示法表示数据,字长为8位,8位全用来表示数据(最高位不表示符号),数值表示范围是:0≤X≤2^8-1。
2)指令设计
根据海伦公式计算中所需要的指令,设计三大类模型机指令共十五条,其中包括运算类指令、控制转移类指令、数据传送类指令。
运算类指令包含三种运算,算术运算、逻辑运算和移位运算,设计有 6 条运算类指令,分别为:ADD、AND、DEC、SUB、OR、SAR,所有运算类指令都为单字节,寻址方式采用寄存器直接寻址。
控制转移类指令有三条 HLT、JMP、BZC,用以控制程序的分支和转移,其中HLT 为单字节指令,JMP和BZC为双字节指令。
数据传送类指令有IN、OUT、MOV、LDI、LAD、STA 共 6 条,用以完成寄存器和寄存器、寄存器和I/O、寄存器和存储器之间的数据交换,除 MOV指令为单字节指令外,其余均为双字节指令。
3)指令格式
所有单字节指令(ADD、AND、DEC、SUB、OR、SAR、HLT和MOV)格式如下:
7 6 4 5 | 3 2 | 1 0 |
---|---|---|
OP-CODE | RS | RD |
其中,OP-CODE为操作码,RS为源寄存器,RD为目的寄存器,并规定:
RS或RD | 选定的寄存器 |
---|---|
00 | R0 |
01 | R1 |
10 | R2 |
11 | R3 |
IN和OUT的指令格式为:
7 6 5 4 (1) | 3 2 (1) | 1 0 (1) | 7-0(2) |
---|---|---|---|
OP-CODE | RS | RD | P |
其中括号中的 1 表示指令的第一字节,2 表示指令的第二字节,OP-CODE 为操作码,RS为源寄存器,RD 为目的寄存器,P为 I/O 端口号,占用一个字节,系统的 I/O地址译码原理见图1(在地址总线单元)。
图1 I/O地址译码原理图
由于用的是地址总线的高两位进行译码,I/O地址空间被分为四个区,如表1所示:
表1 I/O地址空间分配
A7 A6 | 选定 | 地址空间 |
---|---|---|
00 | IOY0 | 00-3F |
01 | IOY1 | 40-7F |
10 | IOY2 | 80-BF |
11 | IOY3 | C0-FF |
系统设计五种数据寻址方式,即立即、直接、间接、变址和相对寻址,LDI指令为立即寻址,LAD、STA、JMP和BZC指令均具备直接、间接、变址和相对寻址能力。
LDI的指令格式如下,第一字节内容与上文同,第二字节为立即数。
7 6 5 4 (1) | 3 2 (1) | 1 0 (1) | 7-0(2) |
---|---|---|---|
OP-CODE | RS | RD | data |
LAD、STA、JMP和BZC指令格式如下。
7 6 5 4 (1) | 3 2 (1) | 1 0 (1) | 7-0(2) |
---|---|---|---|
OP-CODE | M | RD | data |
其中M为寻址模式,具体见表2,以R2作为变址寄存器RI。
表2 寻址方式
寻址模式M | 有效地址E | 说明 |
---|---|---|
00 | E=D | 直接寻址 |
01 | E=(D) | 间接寻址 |
10 | E=(RI)+D | RI变址寻址 |
11 | E=(PC)+D | 相对寻址 |
4)指令系统
根据实验计算海伦公式的目标,设计的15条基本指令如下,包括指令的格式、汇编符号、指令功能。
表3 指令描述
助记符号 | 指令格式 | 指令功能 |
---|---|---|
MOV RD,RS | 0100 | RS |
ADD RD,RS | 0000 | RS |
SUB RD,RS | 1000 | RS |
AND RD,RS | 0001 | RS |
OR RD,RS | 1001 | RS |
SAR RD,RS | 1010 | RS |
DEC RD | 0111 | ** |
LAD M R,RD | 1100 | M |
STA M R,RS | 1101 | M |
JMP M D | 1110 | M |
BZC M D | 1111 | M |
IN RD,P | 0010 | ** |
OUT P,RS | 0011 | RS |
LDI RD,R | 0110 | ** |
HALT | 0101 | ** |
三、总体设计
模型机的数据通路框图如图2所示。
图2 数据通路框图
实验使用的模型机指令多,寻址方式多,指令译码电路需要复杂设计。图3所示在IR单元的INS-DEC中实现。
图3 指令译码原理图
本实验中要用到四个通用寄存器R3~R0,而对寄存器的选择是通过指令的低四位,为此还得设计一个寄存器译码电路,在IR单元的REG_DEC(GAL16V8)中实现,如图4所示。
图4 寄存器译码原理图
根据设计的机器指令要求,设计微程序流程图及确定微地址,如图5所示。
按照系统建议的微指令格式,见表4,参照微指令流程图,将每条微指令代码化,译成二进制代码表,如表5,并将二进制代码表转化为联机操作时的十六进制格式文件。
表4 微指令格式
图5 微指令流程图
表5 二进制码表
地址 | 十六进制表示 | 高五位 | S3-S0 | A字段 | B字段 | C字段 | UA5-UA0 |
---|---|---|---|---|---|---|---|
00 | 000001 | 00000 | 0000 | 000 | 000 | 000 | 000001 |
01 | 006D43 | 00000 | 0000 | 110 | 110 | 101 | 000011 |
03 | 107070 | 00010 | 0000 | 111 | 000 | 001 | 110000 |
04 | 002405 | 00000 | 0000 | 010 | 010 | 000 | 000101 |
05 | 04B201 | 00000 | 1001 | 011 | 001 | 000 | 000001 |
06 | 002407 | 00000 | 0000 | 010 | 010 | 000 | 000111 |
07 | 013201 | 00000 | 0010 | 011 | 001 | 000 | 000001 |
08 | 106009 | 00010 | 0000 | 110 | 000 | 000 | 001001 |
09 | 183001 | 00011 | 0000 | 011 | 000 | 000 | 000001 |
0A | 106010 | 00010 | 0000 | 110 | 000 | 000 | 010000 |
0B | 000001 | 00000 | 0000 | 000 | 000 | 000 | 000001 |
0C | 103001 | 00010 | 0000 | 011 | 000 | 000 | 000001 |
0D | 200601 | 00100 | 0000 | 000 | 011 | 000 | 000001 |
0E | 005341 | 00000 | 0000 | 101 | 001 | 101 | 000001 |
0F | 0000CB | 00000 | 0000 | 000 | 000 | 011 | 001011 |
10 | 280401 | 00101 | 0000 | 000 | 010 | 000 | 000001 |
11 | 103001 | 00010 | 0000 | 011 | 000 | 000 | 000001 |
12 | 063201 | 00000 | 1100 | 011 | 001 | 000 | 000001 |
13 | 002414 | 00000 | 0000 | 010 | 010 | 000 | 010100 |
14 | 05B201 | 00000 | 1011 | 011 | 001 | 000 | 000001 |
15 | 002416 | 00000 | 0000 | 010 | 010 | 000 | 010110 |
16 | 01B201 | 00000 | 0011 | 011 | 001 | 000 | 000001 |
17 | 002418 | 00000 | 0000 | 010 | 010 | 000 | 011000 |
18 | 033201 | 00000 | 0110 | 011 | 001 | 000 | 000001 |
1B | 005341 | 00000 | 0000 | 101 | 001 | 101 | 000001 |
1C | 10101D | 00010 | 0000 | 001 | 000 | 000 | 011101 |
1D | 10608C | 00010 | 0000 | 110 | 000 | 010 | 001100 |
1E | 10601F | 00010 | 0000 | 110 | 000 | 000 | 011111 |
1F | 101020 | 00010 | 0000 | 001 | 000 | 000 | 100000 |
20 | 10608C | 00010 | 0000 | 110 | 000 | 010 | 001100 |
28 | 101029 | 00010 | 0000 | 001 | 000 | 000 | 101001 |
29 | 00282A | 00000 | 0000 | 010 | 100 | 000 | 101010 |
2A | 04E22B | 00000 | 1001 | 110 | 001 | 000 | 101011 |
2B | 04928C | 00000 | 1001 | 001 | 001 | 010 | 001100 |
2C | 10102D | 00010 | 0000 | 001 | 000 | 000 | 101101 |
2D | 002C2E | 00000 | 0000 | 010 | 110 | 000 | 101110 |
2E | 04E22F | 00000 | 1001 | 110 | 001 | 000 | 101111 |
2F | 04928C | 00000 | 1001 | 001 | 001 | 010 | 001100 |
30 | 001604 | 00000 | 0000 | 001 | 011 | 000 | 000100 |
31 | 001606 | 00000 | 0000 | 001 | 011 | 000 | 000110 |
32 | 006D48 | 00000 | 0000 | 110 | 110 | 101 | 001000 |
33 | 006D4A | 00000 | 0000 | 110 | 110 | 101 | 001010 |
34 | 003401 | 00000 | 0000 | 011 | 010 | 000 | 000001 |
35 | 000035 | 00000 | 0000 | 000 | 000 | 000 | 110101 |
36 | 006D51 | 00000 | 0000 | 110 | 110 | 101 | 010001 |
37 | 001612 | 00000 | 0000 | 001 | 011 | 000 | 010010 |
38 | 001613 | 00000 | 0000 | 001 | 011 | 000 | 010011 |
39 | 001615 | 00000 | 0000 | 001 | 011 | 000 | 010101 |
3A | 001617 | 00000 | 0000 | 001 | 011 | 000 | 010111 |
3B | 000001 | 00000 | 0000 | 000 | 000 | 000 | 000001 |
3C | 006D5C | 00000 | 0000 | 110 | 110 | 101 | 011100 |
3D | 006D5E | 00000 | 0000 | 110 | 110 | 101 | 011110 |
3E | 006D68 | 00000 | 0000 | 110 | 110 | 101 | 101000 |
3F | 006D6C | 00000 | 0000 | 110 | 110 | 101 | 101100 |
根据实验计算海伦公式的目标,以及基于此设计的机器指令,在模型机实现以下运算:从IN单元读入三角形三边(要求输入三边一定能构成三角形),求此三角形的面积平方,将所求结果存于61H单元,机器指令流程图如图6。
图6 机器指令流程图
根据流程图设计表6程序,地址和内容均为二进制。
表6 机器指令程序
地址 | 内容 | 助记符 | 说明 |
---|---|---|---|
00000000 | 00100000 | IN R0,00H | 读入a |
00000001 | 00000000 | ||
00000010 | 00100001 | IN R1,00H | 读入b |
00000011 | 00000000 | ||
00000100 | 00100010 | IN R2,00H | 读入c |
00000101 | 00000000 | ||
00000110 | 11010000 | STA 60H,R0 | 将a存入60H |
00000111 | 01100000 | ||
00001000 | 00000100 | ADD R0,R1 | a+b存入R0 |
00001001 | 00001000 | ADD R0,R2 | a+b+c存入R0 |
00001010 | 01100011 | LDI R3,01H | 将1存入R3 |
00001011 | 00000001 | ||
00001100 | 10101100 | SAR R0,R3 | a+b+c向右移一位,R0=P |
00001101 | 01000011 | MOV R3,R0 | 将p移入R3 |
00001110 | 10000100 | SUB R0,R1 | R0=P-B |
00001111 | 01001101 | MOV R1,R3 | 将P存入R1 |
00010000 | 10001001 | SUB R1,R2 | P-C存入R1 |
00010001 | 01000010 | MOV R2,R0 | 将R0移入R2,作为乘数准备 |
00010010 | 01110001 | DEC R1 | 将另一个乘数减1,做好准备 |
00010011 | 11110000 | BZC RESULT | 判断 |
00010100 | 00011011 | ||
00010101 | 00001000 | LOOP:ADD R0,R2 | 开始乘法 |
00010110 | 01110001 | DEC R1 | |
00010111 | 11110000 | BZC RESULT | 判断 |
00011000 | 00011011 | ||
00011001 | 11100000 | JMP LOOP | 回到LOOP开始 |
00011010 | 00010101 | ||
00011011 | 01001101 | MOV R1,R3 | 将P存回R1 |
00011100 | 01110001 | DEC R1 | 将另一个乘数减1,做好准备 |
00011101 | 11110000 | BZC RESULT | 判断 |
00011110 | 00100110 | ||
00011111 | 01000010 | MOV R2,R0 | 将R0移入R2,作为乘数准备 |
00100000 | 00001000 | LOOP:ADD R0,R2 | 开始乘法 |
00100001 | 01110001 | DEC R1 | |
00100010 | 11110000 | BZC RESULT | 判断 |
00100011 | 00100110 | ||
00100100 | 11100000 | JMP LOOP | 回到LOOP开始 |
00100101 | 00100000 | ||
00100110 | 11000001 | LAD 00 R1,60H | 将a重新放入R1 |
00100111 | 01100000 | ||
00101000 | 10000111 | SUB R3,R1 | R3=P-A |
00101001 | 01001101 | MOV R1,R3 | R3->R1 |
00101010 | 01000010 | MOV R2,R0 | R0->R2 |
00101011 | 01110001 | DEC R1 | |
00101100 | 11110000 | BZC RESULT | 判断 |
00101101 | 00110100 | ||
00101110 | 00001000 | LOOP:ADD R0,R2 | 开始乘法 |
00101111 | 01110001 | DEC R1 | |
00110000 | 11110000 | BZC RESULT | 判断 |
00110001 | 00110100 | ||
00110010 | 11100000 | JMP LOOP | 回到LOOP开始 |
00110011 | 00101110 | ||
00110100 | 11010000 | STA 61H,R0 | 将所得结果存入61H |
00110101 | 01100001 | ||
00110110 | 00110000 | OUT 40H,R0 | 将所得结果输出 |
00110111 | 01000000 |
四、实验步骤
1. 按图6连接实验线路,仔细检查连线后打开实验箱电源。
图7 实验连线图
2. 写入实验程序,并进行校验。
联机软件提供了微程序和机器程序下载功能,以代替手动读写微程序和机器程序,但是微程序和机器程序得以指定的格式写入到以TXT为后缀的文件中,本次实验程序如下,程序中分号';'为注释符,分号后面的内容在下载时将被忽略掉。 TXT文件如下:
; //*************************************** //
; // //
; // 复杂模型机实验指令文件 //
; // //
; // By TangDu CO.,LTD //
; // //
; //*************************************** //
; //****** Start Of Main Memory Data ****** //
$P 00 20 ;IN R0,00H
$P 01 00
$P 02 21 ;IN R1,00H
$P 03 00
$P 04 22 ;IN R2,00H
$P 05 00
$P 06 D0 ;STA 60H,R0
$P 07 60
$P 08 04 ;ADD R0,R1
$P 09 08 ;ADD R0,R2
$P 0A 63 ;LDI R3,01H
$P 0B 01
$P 0C AC ;SAR R0,R3
$P 0D 43 ;MOV R3,R0
$P 0E 84 ;SUB R0,R1
$P 0F 4D ;MOV R1,R3
$P 10 89 ;SUB R1,R2
$P 11 42 ;MOV R2,R0
$P 12 71 ;DEC R1
$P 13 F0 ;BZC RESULT
$P 14 1B
$P 15 08 ;LOOP:ADD R0,R2
$P 16 71 ;DEC R1
$P 17 F0 ;BZC RESULT
$P 18 1B
$P 19 E0 ;JMP LOOP
$P 1A 15
$P 1B 4D ;MOV R1,R3
$P 1C 71 ;DEC R1
$P 1D F0 ;BZC RESULT
$P 1E 26
$P 1F 22 ;MOV R2,R0
$P 20 08 ;LOOP:ADD R0,R2
$P 21 71 ;DEC R1
$P 22 F0 ;BZC RESULT
$P 23 26
$P 24 E0 ;JMP LOOP
$P 25 20
$P 26 C1 ;LAD 00 R1,60H
$P 27 60
$P 28 87 ;SUB R3,R1
$P 29 4D ;MOV R1,R3
$P 2A 42 ;MOV R2,R0
$P 2B 71 ;DEC R1
$P 2C F0 ;BZC RESULT
$P 2D 34
$P 2E 08 ;LOOP:ADD R0,R2
$P 2F 71 ;DEC R1
$P 30 F0 ;BZC RESULT
$P 31 34
$P 32 E0 ;JMP LOOP
$P 33 2E
$P 34 D0 ;STA 61H,R0
$P 35 61
$P 36 30 ;OUT 40H,R0
$P 37 40
; //***** End Of Main Memory Data *****//
; //** Start Of MicroController Data **//
$M 00 000001 ; NOP
$M 01 006D43 ; PC->AR, PC加1
$M 03 107070 ; MEM->IR, P<1>
$M 04 002405 ; RS->B
$M 05 04B201 ; A加B->RD
$M 06 002407 ; RS->B
$M 07 013201 ; A与B->RD
$M 08 106009 ; MEM->AR
$M 09 183001 ; IO->RD
$M 0A 106010 ; MEM->AR
$M 0B 000001 ; NOP
$M 0C 103001 ; MEM->RD
$M 0D 200601 ; RD->MEM
$M 0E 005341 ; A->PC
$M 0F 0000CB ; NOP, P<3>
$M 10 280401 ; RS->IO
$M 11 103001 ; MEM->RD
$M 12 063201 ; A减1->RD
$M 13 002414 ; RS->B
$M 14 05B201 ; A减B->RD
$M 15 002416 ; RS->B
$M 16 01B201 ; A或B->RD
$M 17 002418 ; RS->B
$M 18 033201 ; A右移->RD
$M 1B 005341 ; A->PC
$M 1C 10101D ; MEM->A
$M 1D 10608C ; MEM->AR, P<2>
$M 1E 10601F ; MEM->AR
$M 1F 101020 ; MEM->A
$M 20 10608C ; MEM->AR, P<2>
$M 28 101029 ; MEM->A
$M 29 00282A ; RI->B
$M 2A 04E22B ; A加B->AR
$M 2B 04928C ; A加B->A, P<2>
$M 2C 10102D ; MEM->A
$M 2D 002C2E ; PC->B
$M 2E 04E22F ; A加B->AR
$M 2F 04928C ; A加B->A, P<2>
$M 30 001604 ; RD->A
$M 31 001606 ; RD->A
$M 32 006D48 ; PC->AR, PC加1
$M 33 006D4A ; PC->AR, PC加1
$M 34 003401 ; RS->RD
$M 35 000035 ; NOP
$M 36 006D51 ; PC->AR, PC加1
$M 37 001612 ; RD->A
$M 38 001613 ; RD->A
$M 39 001615 ; RD->A
$M 3A 001617 ; RD->A
$M 3B 000001 ; NOP
$M 3C 006D5C ; PC->AR, PC加1
$M 3D 006D5E ; PC->AR, PC加1
$M 3E 006D68 ; PC->AR, PC加1
$M 3F 006D6C ; PC->AR, PC加1
3. 运行程序
进入软件界面,选择菜单命令"【实验】—【CISC 实验】",打开相应的数据通路图,选择相应的功能命令,即可联机运行、监控、调试程序。
按动CON单元的总清按钮CLR,然后通过软件运行程序,当模型机执行完OUT指令后,检查OUT单元显示的数是否正确。在数据通路图和微程序流中观测指令的执行过程,并观测软件中地址总线、数据总线以及微指令显示和下位机是否一致。
五、实验结果
考虑到模拟机的硬件约束,因此采用边长分别为3、4、5的三角形来测试程序。
按程序步骤依次输入3、4、5后,程序最终输出24H(即十进制36),结果符合预期,可认为机器指令及对应的微程序设计正确,模型机可按海伦公式计算三角形面积的平方。
图8 实验结果图
六、实验中遇到的问题与分析
海伦公式的实现需要用到乘法,程序中使用累加的方式实现乘法,但乘数一开始是从原数开始累加,而不是从0开始累加,因此需要在乘法前就需要将另一个乘数减1,否则执行乘法时会多加一次。
上一篇: php输入流php input的使用分析
下一篇: PHP 转义使用详解_PHP教程