Dais-CMH+实验箱扩展指令实现

2023-11-03 09:10

本文主要是介绍Dais-CMH+实验箱扩展指令实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 设计原理

算术运算

将需要计算的数放入指定寄存器中后调用不同的微操作就可以实现不同的算术运算,需要修改的仅仅是一行代码,下面以减法为例,只需要令CBA=010AN=1,S1=1,S2=1,DR0=1就可以实现DR1-DR2,并且将计算结果放入R0,即微操作为40 26 02 80。

逻辑运算

逻辑运算依旧借助于ALU实现,所以基本流程也是将需要进行逻辑运算的数放入DR1和DR2,然后修改CBA,CN,M,S0,S1,S2,S3就可以实现多种操作,下面不再给出整个微程序。

可以实现的指令

AND,OR,NOT

AND微操作40 17 02 80

OR微操作40 1D 02 80

NOT微操作40 00 02 80

移位运算

移位运算通过74LS299芯片实现,首先将需要进行移位的数值放入299芯片,即置数,然后通过控制S0,S1实现操控299实现左移和右移,通过控制M实现带进位左移和带进位右移。

移位运算的实现需要三步,第一步是将需要移位的数放入299,即A0 0C 00 90;第二步是进行移位操作,即60 04 00 50;第三步是将运算后的数取出放入寄存器,即60 00 02 80。

CALL、RET指令

微程序执行过程中执行到CALL指令时会跳转到CALL指令给出的子程序地址,即将CALL指令给出的子程序入口地址放入PC,再进行PC->AR,执行子程序,但是在跳转到子程序执行之前需要将本来要执行的下一指令的地址保存起来,然后当执行完子程序需要返回时,需要将保存的地址拿出,放入PC,再返回执行,这样就可以实现执行完子程序后继续执行原有程序的功能。

MUL、BZC指令

乘法指令通过连加实现,即将被乘数与乘数放在内存中,先将乘数取出放入R0,作为计数,即表示需要连加多少次才能实现乘法,然后将被乘数取出放入DR1和DR2,进行加法运算,将得出的结果再放入储存被乘数的内存地址中,即表示执行完乘法运算后,被乘数没有被保留,如果要保留被乘数的话,由于寄存器只有R0,DR1,DR2可用,所以需要将中间结果放入某个内存地址,其必然会更繁琐,减慢速度。接下来将R0-1再放入R0,然使用P(Z)标注测试,如果乘数变为0,表示连加完成,否则通过修改PC使其再次执行连加运算,直到R0为全0,即跳出循环,完成乘法。乘法指令这里使用的是简单方法,容易实现但效率不高,更合理的方法在下面。

 

HLT指令

HLT即停机指令,即执行到该指令就停止,不再执行其他指令,可以使其下地址执行本身地址即可。

微指令实现

例:M2C 00 00 00 34

JMP指令

JMP指令可以实现跳转到指定位置,具体实现为将JMP给出的地址放入AR,取出在RAM存储的需要跳转到的位置,放入PC,再次取指执行就可以了,JMP为无条件跳转,而且跳转后由于未保存本来要执行的下一条地址,所以无法返回。

微指令实现

20 00 60 __    ;PC→AR,PC+1

00 C0 20 80    ;RAM→PC

  1. 机器指令程序和微程序码点表

减法

;PXX XX

;DIEZHI JIQIDAIMA

 

P00  40 09          ;LDA DR1,09H        ;

P02  60 0A          ;SUB DR1,0AH        ;

;------------以下为数据空间------------

P09  AA

P0A  55

 

M00  00 00 00 80    ;

M01 20 00 60 40    ;PC→AR,PC+1

M02 00 80 10 12    ;RAM→IR

M03 00 80 40 20    ;RAM→AR

M04 00 80 04 70    ;RAM→DR1 

M05 00 80 40 E8    ;RAM→AR    (0AH)->AR

M06 00 80 08 E0    ;RAM→DR2

M07  40 26 02 80    ;DR1-DR2->R0

M08  00 00 00 80    ;

M09  00 00 00 80    ;

M0A  20 00 60 C0    ;

M0F  00 00 00 80    ;

M10  00 00 00 80    ;

M11  00 00 00 80    ;

M12  00 00 00 80    ;

M13  00 00 00 80    ;

M14  00 00 00 80    ;

M15  00 80 08 E0    ;

M16  00 80 08 E0    ;

M17 00 80 08 E0    ;RAM→DR2

可以实现的指令

ADD,SUB,ADC,SBC

依旧将需要计算的数放入DR1和DR2,最后修改的只是进行计算的那一行微操作。

ADD微操作50 29 02 80

SUB微操作40 26 02 80

ADC微操作50 09 02 80

SBC微操作50 06 02 80

299右移

;PXX XX

;DIEZHI JIQIDAIMA

 

P00  40 09          ;LDA R0,09H        ;

P02  60             ;RR   R0       ;

;------------以下为数据空间------------

P09  55

 

M00  00 00 00 80    ;

M01 20 00 60 40    ;PC→AR,PC+1

M02 00 80 10 12    ;RAM→IR

M03  00 80 40 20    ;RAM-AR,QU09

M04  00 80 04 80    ;RAM-DR1

M08  A0 0C 00 90    ;DR1-299,TO 09

M09  60 04 00 50    ;<<1 55-54

M0A  60 00 02 80    ;299-DR

M0B  20 00 60 A0    ;

M0C  20 00 60 C0    ;

M0D  00 00 00 80    ;

M0E  20 00 60 10    ;PC-AR ,TO 08

M0F  00 00 00 80    ;

M10  60 00 02 80    ;299-DR1

M11  00 00 00 80    ;

M12  00 00 00 80    ;

M13  00 00 00 80    ;

M14  00 00 00 80    ;

M15  00 80 08 E0    ;

M16  00 80 08 E0    ;

M17  00 80 08 E0    ;

可以实现的指令

SHR,SHL

SHR微操作60 04 00 50

SHL微操作60 08 00 50

CALL、RET指令

;CALL

;PXX XX

;DIEZHI JIQIDAIMA

 

P00  40 0B          ;LDA R0,0BH        ;

P02  60             ;SUB   R0       ;

P03  80 23          ;CALL 23H        ;

P05  60             ;SUB   R0       ;

;------------->->->->->->->------------

P0A  55

P0B  AA

P0C  55

;------------->->->------------

P23  A0 0A          ;LDA 0A,DR1

P25  90 0A         ;ADD 0A,DR1

P27  70            ;RET

 

 

M00  00 00 00 80    ;->->->

M01  20 00 60 40    ;PC->AR,PC+1

M02  00 80 10 12    ;RAM->IR

M03  00 80 40 20    ;RAM->AR

M04  00 80 02 80    ;RAM->R0

M05  80 00 04 60    ;R0->DR1

M06  50 2F 02 80    ;DR1-1->R0

M07  50 29 02 80    ;

M0D  60 04 00 48    ;299

M0E  00 00 00 A0    ;PC->AR,PC+1

M0F  00 00 00 58    ;PC->AR,PC+1

M10  60 08 00 48    ;

M11  00 80 08 48    ;RAM->DR2

M12  E0 00 04 C8    ;SP->DR1

M13  42 2F 00 28    ;DR1-1->SP

M14  40 2F 40 84    ;DR1-1->AR qu 21

M15  40 55 20 80    ;DR2->PC

M16  00 80 40 E8    ;RAM->AR

M17  00 80 04 80    ;RAM->DR1

M18  00 80 40 98    ;RAM->AR

M19  40 A3 01 80    ;DR1+DR1->RAM

M1A  E0 00 04 D8    ;SP->DR1

M1B  42 00 00 38    ;DR1+1->SP

M1C  40 20 40 B8    ;DR1->AR

M1D  00 C0 20 80    ;RAM->PC

M1E  00 00 00 80    ;(CY.Z=0->->)

M1F  00 00 80 72    ;(CY.Z=1)

M20  00 00 02 81    ;SW->Rd

M21  20 80 01 A8    ;Rd->299    qu 15

M22  20 00 60 20    ;PC->AR,PC+1

M23  20 00 60 88    ;PC->AR,PC+1

M24  20 00 60 10    ;PC->AR,PC+1

M25  04 00 00 8E    ;0->ED,

M26  20 00 60 50    ;PC->AR,PC+1

M27  20 00 60 1C    ;PC->AR,PC+1

M28  20 00 40 30    ;PC->AR

M29  04 40 00 80    ;1->EA,

M2A  A0 0C 00 B0    ;Rd->299

M2B  04 00 00 80    ;0->EA,

M2C  A0 0C 00 F0    ;Rd->299

M2D  A0 00 04 58    ;Rd->DR1

M2E  A0 0C 00 08    ;Rd->299

M2F  20 00 60 D8    ;PC->AR,PC+1

M30  00 00 00 80    ;

M31  E0 00 04 4C    ;SP->DR1

M32  42 00 00 CC    ;DR1+1->SP

M33  40 20 40 6C    ;DR1->AR

M34  80 00 04 AC    ;Rs->DR1

M35  50 06 00 18    ;DR1-DR2

M36  00 C0 20 80    ;RAM->PC

M37  00 00 00 80    ;

M38  00 80 02 80    ;RAM->Rd

M39  00 00 00 80    ;

M3A  00 00 00 80    ;

M3B  00 00 00 80    ;

M3C  00 00 08 C9    ;SW->DR2

M3D  40 6F 20 3C    ;DR1-1->PC

M3E  20 00 04 BC    ;PC->DR1

M3F  04 40 00 7E    ;1->ED,

 

MUL、BZC指令

;乘法

;PXX XX

;DIEZHI JIQIDAIMA

 

P00  400B          ;LDA  R0,0BH       ;

P02  700A          ;LDA  DR1,0AH       ;

P04  800A          ;ADD  0AH       ;

P06  A0             ;SUB   R0       ;

P07  90             ;BZC             ;

;------------->->->->->->->------------

P0A  03

P0B  02

P0C  55

 

 

 

M00  00 0000 80    ;

M01  20 0060 40    ;PC-AR,PC+1

M02  00 8010 12    ;RAM-IR

M03  00 8040 20    ;RAM-AR

M04  00 8002 80    ;RAM--R0

M05  80 0004 60    ;R0-DR1

M06  50 2F02 80    ;DR1-1->R0

M07  50 2902 80    ;

M0D  60 0400 48    ;299->->

M0E  20 0004 5C    ;PC->DR1 ==3A

M0F  20 0060 68    ;PC->AR,PC+1

M10  60 0800 48    ;

M11  00 8040 48    ;RAM->AR

M12  40 A301 80    ;DR1+DR1->RAM

M13  80 0004 28    ;R0->DR1

M14  50 2F02 F8    ;DR1-1->R0

M15  40 5520 80    ;

M16  00 8040 E8    ;RAM-AR

M17  00 8004 80    ;RAM-DR1

M18  00 8040 98    ;RAM->AR

M19  40 A301 80    ;DR1+DR1->RAM

M1A  E0 0004 D8    ;SP->DR1

M1B  42 0008 38    ;DR1+1->SP

M1C  40 2040 B8    ;DR1->AR

M1D  00 C020 80    ;RAM->PC

M1E  00 0000 80    ;(CY.Z=0->->)

M1F  00 0080 72    ;(CY.Z=1)

M20  00 0002 81    ;

M21  A0 0C00 C0    ;

M22  20 0060 20    ;

M23  20 0060 88    ;

M24  20 0060 10    ;

M25  04 0000 8E    ;

M26  20 0060 50    ;PC->AR,PC+1

M27  20 0060 1C    ;PC->AR,PC+1

M28  20 0040 30    ;PC->AR

M29  04 4000 80    ;

M2A  A0 0C00 B0    ;Rd->299

M2B  04 0000 80    ;

M2C  A0 0C00 F0    ;Rd->299

M2D  A0 0004 58    ;Rd->DR1

M2E  A0 0C00 08    ;Rd->299

M2F  20 0060 D8    ;PC->AR,PC+1

M30  00 0000 80    ;

M31  E0 0004 4C    ;SP->DR1

M32  42 0000 CC    ;DR1+1->SP

M33  40 2040 6C    ;DR1->AR

M34  80 0004 AC    ;

M35  50 0600 18    ;

M36  00 C020 80    ;

M37  00 0000 80    ;

M38  00 8002 80    ;

M39  00 0000 80    ;

M3A  40 6F04 DC    ;DR1-1->DR1   F0

M3B  40 6F04 3C    ;DR1-1->DR1

M3C  40 6F04 BC    ;DR1-1->DR1

M3D  40 6F20 F0    ;DR1-1-DR1

M3E  40 6F20 F0    ;DR1-1->PC

M3F  04 4000 7E    ;

这篇关于Dais-CMH+实验箱扩展指令实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/337127

相关文章

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.

IDEA实现回退提交的git代码(四种常见场景)

《IDEA实现回退提交的git代码(四种常见场景)》:本文主要介绍IDEA实现回退提交的git代码(四种常见场景),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.已提交commit,还未push到远端(Undo Commit)2.已提交commit并push到

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

golang中slice扩容的具体实现

《golang中slice扩容的具体实现》Go语言中的切片扩容机制是Go运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存,本文主要介绍了golang中slice扩容的具体实现,感兴趣... 目录1. 切片扩容的触发append 函数的实现2. runtime.growslice 函数gro

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

MySQL数据库实现批量表分区完整示例

《MySQL数据库实现批量表分区完整示例》通俗地讲表分区是将一大表,根据条件分割成若干个小表,:本文主要介绍MySQL数据库实现批量表分区的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录一、表分区条件二、常规表和分区表的区别三、表分区的创建四、将既有表转换分区表脚本五、批量转换表为分区

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

Kali Linux安装实现教程(亲测有效)

《KaliLinux安装实现教程(亲测有效)》:本文主要介绍KaliLinux安装实现教程(亲测有效),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载二、安装总结一、下载1、点http://www.chinasem.cn击链接 Get Kali | Kal