视频演示地址:计组课程设计-8位无符号二进制数乘除_哔哩哔哩_bilibili
计算机组成原理课程设计
目录
一、实验目的
二、实验内容
三、实验原理(16分)
3.1、指令系统及分析(4分)
3.2、指令框图及分析(4分)
3.3、指令系统对应微程序二进制代码及分析(4分)
3.4、机器程序及分析(4分)
四、实验步骤(4分)
4.1、微程序写入及校验(2分)
4.2、机器程序写入及校验(2分)
五、实验结果及分析(16分)
5.1、演示程序一(8分)
5.2、演示程序二(8分)
六、实验问题及思考(4分)
七、实验验收答辩环节问题和解答(20分)
综合运用所学计算机组成原理知识,设计并实现较为完整的计算机。
三、实验原理(16分)
数据通路图如下图1:
DR:数据缓冲器 IR:指令寄存器 PC:程序计数器 AR:
数据地址计数器 R0-R3:通用寄存器 PSW:状态字寄存器
图1数据通路图
实际连接图如下图2
3.1.1机器指令分析;
模型机设计三大类指令共十五条,其中包括运算类指令、控制转移类指令,数据传送类指令。
运算类指令包含三种运算,算术运算、逻辑运算和移位运算,设计有 6 条运算类指令,分别为:ADD、AND、INC、SUB、OR、RR,所有运算类指令都为单字节,寻址方式采用寄存器直接寻址。控制转移类指令有三条 HLT、JMP、BZC,用以控制程序的分支和转移,其中 HLT为单字节指令,JMP 和 BZC 为双字节指令。数据传送类指令有 IN、OUT、MOV、LDI、LAD、STA 共 6 条,用以完成寄存器和寄存器、寄存器和 I/O、寄存器和存储器之间的数据交换,除MOV 指令为单字节指令外,其余均为双字节指令。
所有单字节指令(ADD、AND、DEC、SUB、OR、SAR、HLT和MOV)格式如下表1:
I7 |
I6 |
I5 |
I4 |
I3 |
I2 |
I1 |
I0 |
OP-CODE |
RS |
RD |
表格 1单字节指令格式
在表1中,I7~I0分别为指令字节的8位(I7为高位,I0为地位)。其中,OP-CODE为操作码,RS为源寄存器,RD为目的寄存器,RS或RD选定的寄存器如下表2所示:
RS或RD |
选定的寄存器 |
00 |
R0 |
01 |
R1 |
10 |
R2 |
11 |
R3 |
表格 2 RS或RD选定的寄存器
IN和OUT的指令格式为:
7 6 5 4 |
3 2 |
1 0 |
7—0 |
OP-CODE |
RS |
RD |
P |
表格 3 IN和OUT的指令格式
其中括号中的 1 表示指令的第一字节,2 表示指令的第二字节,OP-CODE为操作码,RS为源寄存器,RD为目的寄存器,P 为 I/O 端口号,占用一个字节。
系统设计五种数据寻址方式,即立即、直接、间接、变址和相对寻址,LDI 指令为立即寻址,LAD、STA、JMP 和 BZC指令均具备直接、间接、变址和相对寻址能力。
LDI 的指令格式如下表4,第一字节同前一样,第二字节为立即数。
7 6 5 4 |
3-2 |
1-0 |
7-0 |
OP-CODE |
RS |
RD |
Data |
表格 4 LDI指令格式
LAD、STA、JMP和BZC指令格式如下表5
7 6 5 4 |
3-2 |
1-0 |
7-0 |
OP-CODE |
M |
RD |
D |
表 5 LAD、STA、JMP和BZC指令格式
其中M为寻址模式,具体见表6,以R2做为变址寄存器RI
寻址模式M |
有效地址E |
说明 |
00 |
E=D |
直接寻址 |
01 |
E=(D) |
间接寻址 |
10 |
E=(RI)+D |
RI变址寻址 |
11 |
E=(PC)+D |
相对寻址 |
表6 寻址模式
本模型机共有 15 条基本指令,表 7中 列出了各条指令的格式、汇编符号、指令功能,
下表7为双字长指令的格式和具体功能:
表7 双字长指令指令
下表8为单字长指令的格式和具体功能和注解:
表8 单字长指令指令
3.1.2微指令分析
微指令字长共24位,格式如下表10,A字段含义如下表11,B字段含义如下表12,C字段含义如下表13.
其中,MA5-MA0为6位的后续微地址,A,B,C为3个译码字段,分别由三个控制位译码得到多种指令,S3--S0选择运算功能,WR,RD控制读写。
23 |
22 |
21 |
20 |
19 |
18~15 |
14~12 |
11~9 |
8~6 |
5~0 |
M32 |
M22 |
WR |
RD |
IOM |
S3~S0 |
A字段 |
B字段 |
字段C |
MA5~MA0 |
表10微指令格式
A字段
14 |
13 |
12 |
选择 |
0 |
0 |
0 |
NOP |
0 |
0 |
1 |
LDA |
0 |
1 |
0 |
LDB |
0 |
1 |
1 |
LDRO |
1 |
0 |
0 |
保留 |
1 |
0 |
1 |
LOAD |
1 |
1 |
0 |
LDAR |
1 |
1 |
1 |
LDIR |
表11 A字段格式
B字段
11 |
10 |
9 |
选择 |
0 |
0 |
0 |
NOP |
0 |
0 |
1 |
ALU_B |
0 |
1 |
0 |
RS_B |
0 |
1 |
1 |
RD_B |
1 |
0 |
0 |
RI_B |
1 |
0 |
1 |
保留 |
1 |
1 |
0 |
PC_B |
1 |
1 |
1 |
保留 |
表12 B字段格式
C字段
8 |
7 |
6 |
选择 |
0 |
0 |
0 |
NOP |
0 |
0 |
1 |
P<1> |
0 |
1 |
0 |
P<2> |
0 |
1 |
1 |
P<3> |
1 |
0 |
0 |
保留 |
1 |
0 |
1 |
LDPC |
1 |
1 |
0 |
保留 |
1 |
1 |
1 |
保留 |
表13 C字段格式
指令框图如下图3所示,参考实验书中复杂机模型的微程序流程图,列出了了可以实现的15条微程序的指令框图,操作数准备用于确定寻址方式,p<2>测试用于确定指令功能,P<3>测试用于判断标志位。
可知,MOV指令2个CPU周期,SUB指令3个CPU周期,ADD指令3个CPU周期。下指令框图中一个方框代表一个CPU周期,菱形符号用于表示判别或测试。
图3指令框图
未对该微程序进行修改,微程序对应二进制代码表如下表14。
表14 微指令二进制表
多个微指令组成的序列可以用来实现微程序,参考指令框图对应实现。
分析:因未对其进行修改,便不多做分析了,这边右环移指令是本次课设中我使用较多的指令,可以发现右环移指令和左环移指令其实互通。
含义如下:
$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 17 002418 ; RS->B
$M 18 02B201 ; 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>
完整机器指令如下,旁边有其注解。
$P 00 21;
$P 01 00;
$P 02 63;
$P 03 01;
$P 04 17;R1与R3-->R3;
$P 05 F0;00乘法,01除法
$P 06 B0;FZ=1,乘法指令开始
;;;;-----------------------------除法功能开始------------------------------------------
;初始化:
$P 07 20
$P 08 00 ;被除数存入R0
$P 09 22
$P 0A 00 ;除数存入R2
$P 0B 61 ;R1初始化为00.用于被除数扩展的高八位
$P 0C 00
$P 0D 63
$P 0E F8
$P 0F D3 ;F8存入A0中,用于控制除法结束,过程中会发生变化
$P 10 A0
$P 11 63
$P 12 07
$P 13 D3
$P 14 A1 ;07存入A1,用于左移;过程中不改变
$P 15 E0;
$P 16 1E;
$P 1E D0 ;被除数存入A2中,过程中会改变
$P 1F A2
$P 20 D2 ;除数存入A3中,过程中不改变
$P 21 A3
$P 22 D1
$P 23 A4 ;商存入A4中,过程中会改变
;判断大小
$P 24 88; R0-R2->R0
$P 25 F0; <=则跳转到S2中
$P 26 8A; S2;
$P 27 C0; >则继续计算
$P 28 A2 ; R0取回被除数,此时FC不等于1,FZ也不等于1,进入循环体
;循环体:
$P 29 C3
$P 2A A4 ;重新从A4取出商R3
$P 2B 62
$P 2C 07
$P 2D AB ;1011;R3右移7位
$P 2E C2
$P 2F A3 ;重新从A3取出除数R2
$P 30 D3 ;商更新后存回A4
$P 31 A4
$P 32 C3 ;取出07
$P 33 A1
$P 34 AD ;1101,R1右移7位,实现左移功能
$P 35 AC ;1100,R0右移7位,实现左移功能
$P 36 63
$P 37 01; 避免FC标志位的影响
$P 38 0F; ADD 1111
$P 39 63
$P 3A 01; R3 00000001
$P 3B 1F; AND 1111 避免RR指令中FZ的影响
$P 3C 13; AND 0011 R0与R3-->R3,取低八位的最低位作为高八位的最低位
$P 3D F0; FZ=1则跳转,即最低位为0
$P 3E 46; S4
;S5; FZ不等于1,最低位为1,R3=00000001
$P 3F 9D; 1101 R3 或R1---R1,R1低位置1
$P 40 63; R3=11111110
$P 41 FE
$P 42 1F; AND 111111 避免FZ的影响
$P 43 1C; AND 1100 R3与R0--R0,低位置0,可能影响FZ
$P 44 E0; 跳到S6,开始减法
$P 45 4A
;s4: R0低位为0
$P 46 63 ;R3=11111110
$P 47 FE
$P 48 1D ;AND 1101 R3 R1-->R1 ,低位置0
$P 49 1C ;AND 1100 R3,R0-->R0,低位置0,可能影响FZ,开始减法
;S6:
$P 4A 63;R3=00000001
$P 4B 01;
$P 4C 0F;ADD ,使不进位
$P 4D 63
$P 4E 01;
$P 4F 1F;AND ,不为0,避免上一步的fc=1,FZ=1造成的影响
;R3=00000001
$P 50 D1;先把R1存在A5
$P 51 A5;
$P 52 89; SUB 1001 R1-R2-->R1
$P 53 C3 ; R3取出现在的商A4位置
$P 54 A4;
$P 55 F0;若R1<=R2,为0或产生借位
$P 56 66;S7
;SS: r1>r2,不会产生进位,FC不会等于1,FZ有可能=1
$P 57 62 ;r2=10000000
$P 58 80
$P 59 9B; 1011 r2 或 r3=r3 高位变成1
$P 5A D3;商更新后便存回去A4位置
$P 5B A4;
$P 5C C3;重新A0取出计数值数存到R3中,
$P 5D A0;
$P 5E 1F;R3与R3,使FZ不等于1
$P 5F 73; 0011 R3++
$P 60 F0;判断是否加满8次,FC=1则跳转到结束
$P 61 82;END
$P 62 D3;未结束,则更新后的值存回A0位置
$P 63 A0
$P 64 E0;回到循环体中;此时R1更新了
$P 65 29;循环体
;S7:R1<=R2,R1=R1-R2
$P 66 62;R2=00000001
$P 67 01
$P 68 0A;ADD 1010 使得FC不等于1
$P 69 62;R2=11111111
$P 6A FF
$P 6B 19 ;R2 yu r1=---r1
$P 6C F0 ;R1等于0,FZ=1,跳到SS中
$P 6D 57;SS
;R1 ;S8:R1 $P 6E 62;R2=01111111 $P 6F 7F $P 70 1B;1011 R2与R3-->R3,高位置0 $P 71 D3; 存回A4中 $P 72 A4 $P 73 63 ;R3=000000001 $P 74 01 $P 75 1F $P 76 0F;使得FZ,FC不等于1 $P 77 C3;取出计数值 $P 78 A0 $P 79 73;R3++ $P 7A F0;结束则输出 $P 7B 82;END $P 7C D3 $P 7D A0;存回计数值 $P 7E C1 $P 7F A5;取回R1 $P 80 E0 $P 81 29;跳回循环体 ;END: $P 82 C3 $P 83 A4 $P 84 62 $P 85 07 $P 86 AB $P 87 3C $P 88 40 $P 89 50 ;S2: $P 8A 62 $P 8B FF $P 8C 06 $P 8D 18 $P 8E F0 $P 8F 93;S3 $P 90 34 $P 91 40 $P 92 50 ;S3: $P 93 61 $P 94 01 $P 95 34 ;输出结果 $P 96 40 $P 97 50 ;;;;;;---------------------------------除法指令结束------------------------------ ;;;;;;---------------------------------乘法指令开始------------------------------ $P B0 20; $P B1 00; $P B2 22; $P B3 00; $P B4 61; $P B5 00; $P B6 63; $P B7 F8; $P B8 D3; $P B9 F0; ;循环体 $P BA 63; $P BB 01; $P BC 1F;fz=0 $P BD 1B; AND 1011 R2,R3-->R3,取R2最低位,存入R3 $P BE F0; 为0则跳转C1 $P BF C1; $P C0 01; 为1,ADD 0001 R0+R1-->R1,更新高八位 ;;;C1 $P C1 63; R3=01H $P C2 01; $P C3 AD;1101 R1循环右移1位--r1 $P C4 AE;1110 R2循环右移1位--r2 $P C5 63; R3=7F 0111111 $P C6 7F; R2最低位已经使用过,现在挪到了最高位,置0 $P C7 1E;AND 1110 R3与R2-->R2 $P C8 63;R3=10000000 $P C9 80; $P CA 17;AND 0111 R1与R3-->R3, $P CB 9E;OR 1110 R3或R2--->R2 $P CC 63; R2的最高位变为R1的最高位,原先的最低位,把低位放入R2 $P CD 01;R3=01 $P CE AF;RR 1111 ,使得FZ不等于1 $P CF F0; 判断相加的过程中是否产生了进位,产生了则高位置1 $P D0 E0;溢出; $P D1 63;R3=01111111 $P D2 7F; $P D3 1D;AND 1101 R3yuR1-->R1,否则高位置0 $P D4 63; $P D5 01; $P D6 AF; 1111使得FZ不等于1 $P D7 C3;取出计数值到R3 $P D8 F0; $P D9 73;计数值++ $P DA F0;加到第九次产生进位,FC=1,输出结果 $P DB E5;结束 $P DC D3; $P DD F0; $P DE E0; $P DF BA;循环体; ;;;;溢出 $P E0 63;进位置1 $P E1 80; $P E2 9D; $P E3 E0;跳到 $P E4 D4; $P E5 34; $P E6 40; $P E7 34; $P E8 40; $P E9 34; $P EA 40; $P EB 34; $P EC 40; $P ED 38; $P EE 40; $P EF 50; 规定运算类型和对应输入为下表15: 乘法 除法 R0初始值 R1初始值 R2初始值 R3初始值 00H 01H 操作数a 输入 操作数b 01H 表15 输入格式 选择指令(地址从00--06),流程图如下图4: 图4 选择流程图 即先靠输入选择对应运算,R0存输入选择. R1与R3(01),结果存入R3中,若等于0,则跳转Z1(即输入的为00,选择乘法)。若不等于0,不跳转(即输入的为01),进行除法。以此实现选择运算功能。 乘法模块流程图5,指令地址从07--97: 图5 乘法流程图 除法思想: 除法模块流程图如下,指令地址从B0--EF: 图6乘法流程图 选择联机软件的“ 【转储】—【装载】 ”功能,在打开文件对话框中选择上面所保存的文件,软件自动将机器程序和微程序写入指定单元。 选择联机软件的“ 【转储】—【刷新指令区】 ”可以读出下位机所有的机器指令和微指令,并在指令区显示,对照文件检查微程序和机器程序是否正确,如果不正确,则说明写入操作失败,应重新写入,可以通过联机软件单独修改某个单元的指令,以修改微指令为例,先用鼠标左键单击指令区的‘微存’TAB 按钮,然后再单击需修改单元的数据,此时该单元变为编辑框,输入 6 位数据并回车,编辑框消失,并以红色显示写入的数据。 微程序载入。已校验,无错误。 $M 00 000001; $M 01 006D43; $M 03 107070; $M 04 002405; $M 05 04B201; $M 06 002407; $M 07 013201; $M 08 106009; $M 09 183001; $M 0A 106010; $M 0B 000001; $M 0C 103001; $M 0D 200601; $M 0E 005341; $M 0F 0000CB; $M 10 280401; $M 11 103001; $M 12 06B201; $M 13 002414; $M 14 05B201; $M 15 002416; $M 16 01B201; $M 17 002418; $M 18 02B201; $M 1B 005341; $M 1C 10101D; $M 1D 10608C; $M 1E 10601F; $M 1F 101020; $M 20 10608C; $M 28 101029; $M 29 00282A; $M 2A 04E22B; $M 2B 04928C; $M 2C 10102D; $M 2D 002C2E; $M 2E 04E22F; $M 2F 04928C; $M 30 001604; $M 31 001606; $M 32 006D48; $M 33 006D4A; $M 34 003401; $M 35 000035; $M 36 006D51; $M 37 001612; $M 38 001613; $M 39 001615; $M 3A 001617; $M 3B 000001; $M 3C 006D5C; $M 3D 006D5E; $M 3E 006D68; $M 3F 006D6C; 已成功写入,但未截图。已检查,机器指令已在主存内存好,已校验,没有错误。 数据(3分): 先输入00选择乘法功能,单指令运行几次后,输入被乘数, 乘数01,被乘数01: 结果(2分):先闪现积的高八位,最终显示积的低八位,高八位存R1,低八位存R2,OUT单元先输出八位01,如下图,高八位00,输出正确. 分析(3分): 01H*01H=0001H,结果正确,已实现八位二进制数的乘法功能 数据(3分):先输入01选择除法功能,单指令运行几次后,输入被除数, 除数。如下图所示被除数为C3(H)=197(D),除数为03(H),为3(D),已输入到R0,R2中, 结果(2分):最终显示商的低八位,存在R3中未41(H)=65(D) OUT单元输出为41H: 分析(3分): 197/3=65.667,舍去小数,结果为65(D)=41(H) 结果正确,已实现八位二进制数的除法功能。 1、当前所实现计算机,是否完整?如果不完整,还缺少哪些部件? 不完整,没有改过微指令,有些功能无法直接实现,例如左移、和自减。 2、当前所实现计算机,是否能实现除法运算?如果能,可通过哪些指令实现除法运算? 不可以,只能通过许多微指令序列实现,本实验就有除法功能,具体可参考实验的机器指令实现除法功能。 3、当前所实现计算机,还能实现哪些更复杂的计算?请举例说明 还能计算除法所得的余数,但是本实验中没有存该余数,因为机器指令过长了。 4、当前所实现计算机,指令系统的双字长指令是如何实现的? 双字长指令指令字长度等于两个机器长度的指令。 看指令长度。指令长32位,(注意下面还有位移量16位),因此是双字长。 所有的运算类指令都是单字节指令,AND,ADD,INC,SUB,OR,RR,它们的寻址方式都是直接寻址。数据传输类指令IN,OUT,MOV,LDI,LAD,STA除了MOV外,都是双字节指令。LDI为立即寻址,LAD为直接寻址,STA为间接寻址,JMP为变址寻址,BZC为相对寻址。 ①通路图中的T4是什么:执行指令的第4个节拍。 ②寄存器R0-R3的作用:用于存放运算数。 ③P<2>,P<3>测试框的含义: 菱形框p<2>测试用于确定指令功能,P<3>测试用于判断标志位,以实现条件转移。 以下是实现思想文字描述: 8.1.1乘法功能算法思想: 实现原理:被乘数(设为A7A6A5A4A3A2A1A0)存入R0,乘数存入R2(设为B7B6B5B4B3B2B1B0)中,判断乘数和被乘数是否为0,有一个为0则直接输出积为0,程序结束;若两个数都不为0,则(R1初始值为00H): (1)先判断B的末位为1还是0,若为1,则R0+R1->R1,更新R1的值,进位标志ZF改变;若为0,R1不做处理。 (2)R1,R2均循环右移1位,将R1的最高位(原先最低位)转到R2的最高位中,若加法过程中,不产生进位(ZF=0),则R1最高位置为0.若产生进位(ZF=1),则R1最高位置为1。 (3)重复2步骤8次,输出结果R1存的为积的高八位,R2存的为积的第低八位。 8.1.2除法功能算法思想: 实现原理:被除数(设为A7A6A5A4A3A2A1A0)存入R0,除数存入R2(设为B7B6B5B4B3B2B1B0)中,先判断被除数是否小于等于除数,若等于除数,则直接输出商为1;若小于除数,则直接输出商为0;若大于除数,则: (1)R1存入00H,和R0(被除数)构成16位被除数A,R1为高位,R0为低位。 (2)被除数A左移一位,成为被除数A*,再将B与A*的高八位比较,若A*的高八位大于等于B,则商Si为1,A*的高八位更新为高八位与B的差;反之,商Si为0;(i=7,6,5,4,3,2,1,0) (3)重复2操作8次后,即可得到商S=S7S6S5S4S3S2S1S0 实现难点: (1)微指令只能实现循环右移,如何将两个8位二进制数构成的16位进制数左移:逻辑上,8位二进制左移x位=右移8-x位。 (2)寄存器不够用:不断地放入内存,修改,再放入内存。 (3)过多的BZC指令,判断前需要把影响该判断FZ,FC变为0: 有许多的跳转,也有许多影响FZ,FC标志的指令,每次判断之前都使FC,FZ变无效。 8.2.1整个的乘法的实现: 设被乘数为A,对应二进制数为A7A6A5A4A3A2A1A0,初始存入R0 乘数为B ,对应二进制数为B7B6B5B4B3B2B1B0,初始存入R2 8位二进制数乘以八位二进制数最后的积是16位数二进制数, 所以需要两个寄存器存储最后的结果,一个寄存器存高八位, 一个寄存器存低八位。 本程序中R1存高八位,R2存低八位,R1初始为00,R2初始为B. 根据乘法思想,乘数被乘数都只有8位,所以乘8次即可,所以整个 程序的循环体循环8次。 这是循环体: 先得到 B与上00000001(b)(01H)的结果,即取出乘数的最低位b, 根据最原始计算两数相乘的原理,若此时b=1,则把更新R1,把R0+R1存入 R1(此时记录是否有进位,若有进位,则CF=1,无进位则CF=0);b=0,则R1不更新。 R1和R2(乘数)都循环右移一位,即把最低位移到了最高位,现最高位为原最低位。 R2(乘数)的原最低位已经用过了,可以不再使用,所以把R1的原最低位移入R2的现最高位,为了使R1和R2实现存储16位的积;若更新R1时CF=1(即产生了进位),则把R1高位置1,若更新R1时CF=0(不产生进位),则把R1高位置0。 判断是否循环了8次,已经循环了8次后跳出循环,输出结果 未循环8次则跳入循环体。 8.2.2整个除法的实现: 设被除数为A,对应二进制数为A7A6A5A4A3A2A1A0,初始存入R0 除数为B , 对应二进制数为B7B6B5B4B3B2B1B0,初始存入R2 8位二进制数相除最后的到的商也是8位,只用一个寄存器就可以存商 本程序中,商的结果精确到个位,采用舍入原则。 为了使除法方便进行,先把A扩展为16位,使用R1扩展,初始为00H, R1和R0构成新的被除数A*,除8次即可,所以在R0>R2的情况下,整个程序的循环体循环8次。 若R0=R2,直接输出01结束,若R0 这是R0>R2情况下的循环体: 先把A*(被除数)左移一位: (具体实现方法为:分别将R1和R0都循环右移7次,实现循环左移1次的功能,此时, R0的原最高位变为现最低位,R1也是,我们希望实现的效果是把R0的原最高位移入R1的原最低位中实现被除数的左移,所以,此时把R0的现最低位移入R1的现最低位,再把R0的最低位置为0,实现左移一位的功能 ) 此时,R1和R0中的数据都有所更新,变为左移后的高八位和低八位, 比较R1和R2的大小,若R1(被除数高八位)>=R2,则得到商的一位为1,R1更新为R1-R2的值若R1 处理商的办法,最先得到的为最高位的值,所以每次都将得到的商置为R3的最高位,在将其循环左移一位(方法类似上面),循环8次后,则最先的到的商即为商的最高位。 判断是否循环了8次,已经循环了8次后跳出循环,输出结果R3。 未循环8次则跳入循环体。 收获: 复杂机模型跳转时使用BZC指令,它根据ZF和CF标志跳转的,而BZC指令受上一步中的FC,FZ影响, 由于微指令这边没有直接改FC和FZ的指令,所以只能参与运算人为地改变FC,FZ的值,势必增加代码的长度。 沿用了书本上给的微指令,本来是想对实现的是简单计算器,实现8位二进制数的加减乘除,但是因为指令过长,在0-FF勉强写完了乘法和除法的指令。 代码中可能还存在一些冗余,要分析好每一步导致的FC和FZ的变化,才能运用这两个标志实现下一次的条件跳转,但是因为这里面的条件跳转指令太多了,所以我每次在判断前都是分别吧FZ和fc置0,开始没有分析好各种指令 对FZ和fc的影响,导致代码过长,并且繁琐,所以在开始实验前就应该弄懂实验的原理,分析好代码,提高代码的效率。
四、实验步骤(4分)
4.1、微程序写入及校验(2分)
4.2、机器程序写入及校验(2分)
五、实验结果及分析(16分)
5.1、演示程序一(8分)
5.2、演示程序二(8分)
六、实验问题及思考(4分)
七、实验验收答辩环节问题和解答(20分)
八、实验收获