计算机组成原理课程设计—— 8位无符号二进制数乘除

视频演示地址:计组课程设计-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分)

一、实验目的

综合运用所学计算机组成原理知识,设计并实现较为完整的计算机。

二、实验内容

  1. 设计并实现一套完整的指令系统;
  2. 设计并实现完整的计算机(采用上述指令系统);
  3. 利用该计算机实现   8位无符号二进制数乘除     (比如数组累加和等)。

三、实验原理(16分)

数据通路图如下图1:

DR:数据缓冲器  IR:指令寄存器  PC:程序计数器  AR:

数据地址计数器  R0-R3:通用寄存器 PSW:状态字寄存器

计算机组成原理课程设计—— 8位无符号二进制数乘除_第1张图片

图1数据通路图

实际连接图如下图2

计算机组成原理课程设计—— 8位无符号二进制数乘除_第2张图片

图2 实际连接图

3.1、指令系统及分析(4分)

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为双字长指令的格式和具体功能:

计算机组成原理课程设计—— 8位无符号二进制数乘除_第3张图片

表7 双字长指令指令

下表8为单字长指令的格式和具体功能和注解:

计算机组成原理课程设计—— 8位无符号二进制数乘除_第4张图片

表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

1815

1412

119

86

50

M32   

M22

WR

RD

IOM

S3S0

A字段

B字段

字段C

MA5MA0

表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.2、指令框图及分析(4分)

指令框图如下图3所示,参考实验书中复杂机模型的微程序流程图,列出了了可以实现的15条微程序的指令框图,操作数准备用于确定寻址方式,p<2>测试用于确定指令功能,P<3>测试用于判断标志位。

可知,MOV指令2个CPU周期,SUB指令3个CPU周期,ADD指令3个CPU周期。下指令框图中一个方框代表一个CPU周期,菱形符号用于表示判别或测试。

计算机组成原理课程设计—— 8位无符号二进制数乘除_第5张图片

图3指令框图

3.3、指令系统对应微程序二进制代码及分析(4分)

 未对该微程序进行修改,微程序对应二进制代码表如下表14。

计算机组成原理课程设计—— 8位无符号二进制数乘除_第6张图片

计算机组成原理课程设计—— 8位无符号二进制数乘除_第7张图片

表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

计算机组成原理课程设计—— 8位无符号二进制数乘除_第8张图片

  $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>

计算机组成原理课程设计—— 8位无符号二进制数乘除_第9张图片

3.4、机器程序及分析(4分)

完整机器指令如下,旁边有其注解。

$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:

计算机组成原理课程设计—— 8位无符号二进制数乘除_第10张图片

图4 选择流程图

即先靠输入选择对应运算,R0存输入选择.

R1与R3(01),结果存入R3中,若等于0,则跳转Z1(即输入的为00,选择乘法)。若不等于0,不跳转(即输入的为01),进行除法。以此实现选择运算功能。

乘法模块流程图5,指令地址从07--97:

计算机组成原理课程设计—— 8位无符号二进制数乘除_第11张图片

图5 乘法流程图

除法思想:

计算机组成原理课程设计—— 8位无符号二进制数乘除_第12张图片

除法模块流程图如下,指令地址从B0--EF:

计算机组成原理课程设计—— 8位无符号二进制数乘除_第13张图片

图6乘法流程图

四、实验步骤(4分)

选择联机软件的“ 【转储】—【装载】 ”功能,在打开文件对话框中选择上面所保存的文件,软件自动将机器程序和微程序写入指定单元。

选择联机软件的“ 【转储】—【刷新指令区】 ”可以读出下位机所有的机器指令和微指令,并在指令区显示,对照文件检查微程序和机器程序是否正确,如果不正确,则说明写入操作失败,应重新写入,可以通过联机软件单独修改某个单元的指令,以修改微指令为例,先用鼠标左键单击指令区的‘微存’TAB 按钮,然后再单击需修改单元的数据,此时该单元变为编辑框,输入 6 位数据并回车,编辑框消失,并以红色显示写入的数据。

4.1、微程序写入及校验(2分)

微程序载入。已校验,无错误。

$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;

4.2、机器程序写入及校验(2分)

已成功写入,但未截图。已检查,机器指令已在主存内存好,已校验,没有错误。

五、实验结果及分析(16分)

5.1、演示程序一(8分)

数据(3分):

先输入00选择乘法功能,单指令运行几次后,输入被乘数,

乘数01,被乘数01:

计算机组成原理课程设计—— 8位无符号二进制数乘除_第14张图片

结果(2分):先闪现积的高八位,最终显示积的低八位,高八位存R1,低八位存R2,OUT单元先输出八位01,如下图,高八位00,输出正确.

分析(3分):

 计算机组成原理课程设计—— 8位无符号二进制数乘除_第15张图片

01H*01H=0001H,结果正确,已实现八位二进制数的乘法功能

5.2、演示程序二(8分)

数据(3分):先输入01选择除法功能,单指令运行几次后,输入被除数,

除数。如下图所示被除数为C3(H)=197(D),除数为03(H),为3(D),已输入到R0,R2中,

计算机组成原理课程设计—— 8位无符号二进制数乘除_第16张图片

结果(2分):最终显示商的低八位,存在R3中未41(H)=65(D)

OUT单元输出为41H:

计算机组成原理课程设计—— 8位无符号二进制数乘除_第17张图片

分析(3分):

197/3=65.667,舍去小数,结果为65(D)=41(H)

结果正确,已实现八位二进制数的除法功能。

六、实验问题及思考(4分)

1、当前所实现计算机,是否完整?如果不完整,还缺少哪些部件?

不完整,没有改过微指令,有些功能无法直接实现,例如左移、和自减。

2、当前所实现计算机,是否能实现除法运算?如果能,可通过哪些指令实现除法运算?

不可以,只能通过许多微指令序列实现,本实验就有除法功能,具体可参考实验的机器指令实现除法功能。

3、当前所实现计算机,还能实现哪些更复杂的计算?请举例说明

还能计算除法所得的余数,但是本实验中没有存该余数,因为机器指令过长了。

4、当前所实现计算机,指令系统的双字长指令是如何实现的?

双字长指令指令字长度等于两个机器长度的指令。

看指令长度。指令长32位,(注意下面还有位移量16位),因此是双字长。

所有的运算类指令都是单字节指令,AND,ADD,INC,SUB,OR,RR,它们的寻址方式都是直接寻址。数据传输类指令IN,OUT,MOV,LDI,LAD,STA除了MOV外,都是双字节指令。LDI为立即寻址,LAD为直接寻址,STA为间接寻址,JMP为变址寻址,BZC为相对寻址。

七、实验验收答辩环节问题和解答(20分)

①通路图中的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的影响,导致代码过长,并且繁琐,所以在开始实验前就应该弄懂实验的原理,分析好代码,提高代码的效率。

你可能感兴趣的:(机器学习)