长春:单指令处理器

我想谈谈我在2016年开发的处理器。 它在C中作为虚拟机实现。 我的朋友比约恩(Björn)在F#中为他编写了汇编程序。

与RISC和CISC不同,Periwinkle是OISC (一个指令集计算机)处理器。 它没有流水线。 实际上,生产力并不是该项目的主要目标,它的创建更多是出于娱乐和教育目的。

我的朋友Alena提出了长春花的名字,即长春花(这种坚韧的花朵被认为是生命力的象征-大约Per​​。)。

OISC的指示类型很多。 但是在荔枝螺中,这是一个举动。 只需将文字移到一个寄存器或值从一个寄存器移到另一个。 逻辑和算术运算,分支等 使用寄存器执行。

Periwinkle指令的长度稳定为40位。 数据总线32位。



荔枝螺共有64个寄存器。



这里是一些描述:

软件计数器(PC)

  • 计数器最高32位
  • 程序存储器大小为255个40位字(取决于实现)
  • 将-1移到PC寄存器会使计数器显式停止

通用堆栈(STK)
  • 堆叠任何东西(深16层)
  • 无溢出信号,堆栈不完整
  • 读取一个空栈将返回0
  • 在此处移动值是推操作
  • 从这里移动-弹出操作

随机数发生器(RNG)

  • 调用时,生成一个随机的32位数字
  • 在这里移动值似乎毫无意义

如果为零则跳过(SIZ)
  • 如果将零移动到它,则跳过以下语句

如果非零则跳过(SINZ)
  • 如果将非零值移至该语句,则跳过以下语句

参考(REF)

  • 用于根据移动值指示地址
  • 大值将被截断为6位数字。

解除引用(DEF)
  • REF后取消引用

保留寄存器(RSV)
  • 搬到这里没关系。 寄存器将仍然包含零。
  • 将虚拟机转移到微控制器或其他东西时,可用于任何任务
  • 对于将来/其他寄存器
  • 可通过在此处移动项目将其从通用堆栈和操作寄存器中删除(不推荐)
  • 读取时返回0

通用寄存器(GPR0-GPR31)

  • 可能包含32位数字

零寄存器

  • 可以通过在此处移动项目从通用堆栈和操作寄存器中删除该项目
  • 读取时返回0

状态寄存器:

  • 0000 0000 0000 0000 0000 0000 0000 000P ZVNC
  • 包含五个标志(C,N,V,Z,P)
  • 携带
  • 负数
  • 溢流

  • PLUS寄存器影响标志C,N,V,Z,P
  • 寄存器AND,OR,XOR影响标志N,Z,P
  • 上次运行的操作会影响状态寄存器
  • 在这里移动含义似乎毫无意义。

但是PLUS,AND,OR,XOR寄存器如何工作? 这四个寄存器具有一个特殊的堆栈,实际上是一个计算堆栈。 当计算堆栈中有两个数字时,操作开始。



这是PLUS寄存器的示例。 该方案对其他三个寄存器的工作方式相似。

但是如何仅用四个运算符执行算术运算呢? 正如我所说,该项目的目标是娱乐和教育。 因此,您可以独立合成丢失的动作。

减法是通过添加表示负数的附加代码来完成的。 通过位反转,即通过XOR推送数字0xFFFFFFFF(2³²-1),可以形成一个附加代码。 并通过PLUS寄存器添加一个。 但是,汇编程序支持负数,因此没有必要做所有这些事情。

乘法只是多次加法。

除法是在一个数字中放置单个数字的次数。 这可以通过顺序减法的计数器来计算。

通过乘以2或除以2来完成位移位。

考虑一下如何自己合成其他操作。

如果感兴趣的话,这里是我为Periwinkle编写一些汇编程序的github存储库 。 移动指令从左到右起作用:

#50 gpr0 //  50(base-10)  gpr0 gpr0 gpr1 //  gpr0  gpr1 

另外,我将尝试上传Periwinkle VM虚拟机的可执行文件。 虚拟机用于什么平台? (Windows(x86?X86-64?),Linux(x86?X86-64?ARM?,ARM64 ?、等等),等等。)由于汇编程序是用F#编写的,因此它可能可以在任何地方使用,您只需要.NET框架 ,就可以看看Mono

如果您知道PIC16体系结构 ,则可能会注意到与荔枝螺的一些相似之处(STATUS,SIZ,SINZ,REF,DEF)。 确实,它激发了我成为我开始用汇编语言进行编程的第一个体系结构的灵感。

Source: https://habr.com/ru/post/zh-CN480024/


All Articles