程序与技术分享:CPU0处理器的架构及应用

简介: 程序与技术分享:CPU0处理器的架构及应用

CPU0 处理器的架构及应用


简介


CPU0 是一个 32 位的处理器,包含 R0..R15, IR, MAR, MDR 等缓存器,结构如下图所示。


图 1 :CPU0 处理器的结构


其中各个缓存器的用途如下所示:


IR


指令缓存器


R0


常数缓存器, 值永远为 0。


R1~R11


通用型缓存器。


R12


状态缓存器 (Status Word : SW)


R13


堆栈指针缓存器 (Stack Pointer : SP)


R14


链接缓存器 (Link Register : LR)


R15


程序计数器 (Program Counter : PC)


MAR


地址缓存器 (Memory Address Register)


MDR


数据缓存器 (Memory Data Register)


CPU0 的指令集


CPU0 的指令分为三种类型,L 型通常为加载储存指令、A 型以算术指令为主、J 型则通常为跳跃指令,下图显示了这三种类型指令的编码格式。


图 2:CPU0 的三种指令格式


以下是 CPU0 处理器的指令表格式


表 1 :CPU0 的指令表


在第二版的 CPU0_v2 中,补上了以下指令:


类型


格式


指令


OP


说明


语法


语意


浮点运算


A


FADD


41


浮点加法


FADD Ra, Rb, Rc


Ra = Rb + Rc


浮点运算


A


FSUB


42


浮点减法


FSUB Ra, Rb, Rc


Ra = Rb + Rc


浮点运算


A


FMUL


43


浮点乘法


FMUL Ra, Rb, Rc


Ra = Rb Rc


浮点运算


A


FADD


44


浮点除法


FDIV Ra, Rb, Rc


Ra = Rb / Rc


中断处理


J


IRET


2D


中断返回


IRET


PC = LR; INT 0


状态缓存器


CPU0 的状态缓存器,包含 N, Z, C, V 等状态,以及 I, T 等中断模式位。结构如下图所示。


图 3:CPU0 的状态缓存器


当 CMP Ra, Rb 指令执行时,状态标志会因而改变。


假如 Ra > Rb, 则会设定状态 N=0, Z=0


假如 Ra < Rb, 则会设定状态 N=1, Z=0


假如 Ra = Rb, 则会设定状态 N=0, Z=1


于是条件式跳跃的 JGT, JLT, JGE,


JLE, JEQ, JNE 等指令,就可以根据状态缓存器中的 N, Z 标志进行跳跃操作。


指令的执行步骤


CPU0在执行一个指令时,必须经过取指、译码与执行等三大阶段。


提取阶段


操作1、提取指令 :IR = 【PC】


操作2、更新计数器 :PC = PC + 4


解碼阶段


操作3、解碼 :控制单元对IR进行译码后,设定数据流向开关与 ALU 的运算模式


运行时间


操作4、执行 :数据流入 ALU,经过运算后,流回指定的缓存器


V-OS:


横跨操作系统与硬件的虚拟机系统


设计一个虚拟机系统,可以将 CPU A, B, C, D, E … 模拟成另外任何一种 CPU,这样是否能解决所有的跨平台问题呢?


QEMU 其实可以做到类似的操作,想法与 QEMU 不同点在于 QEMU 是在操作系统层次之上的,做法是在操作系统层次之下的。


这样子就可以将在任何一个 CPU 上,跑另一个操作系统的程序,但是,不知速度会比 QEMU 快还是慢呢?


这种做法姑且可以想象为「云端虚拟机」!


不知大家觉得可能吗?有用吗?


图一:V-OS 系统的架构图


CC1


编译程序


为了说明编译程序是如何设计出来的,在开放计算机计划中,设计了一个功能完备,简化过的 C 语言,这个语言称为 C1 语言,是


C0 语言的扩充版。


CC1 编译程序是一个 C1 语言的编译程序,具有完成的编译程序功能。在程序设计上,CC1 又被进一步拆解为 1. 词汇分析


2. 语法分析 3. 语意分析 4. 中间码产生 5. 汇编语言产生 等阶段,这所有的阶段,都会存取一个共同的数据结构,就是符号表。


因此,整个 CC1 编译程序,进一步分解为下列程序模块。


模块


核心对象


程序


词汇分析 (Lexical Analysis)


Scanner


Scanner.c, Scanner.h


语法分析 (Syntax Analysis)


Parser


Parser.c, Parser.h


语意分析 (Semantic Analysis)


Semantic


Semantic.c, Semantic.h


中间码产生 (Intermediate


Code)


PCode


PCode.c, PCode.h


汇编语言产生 (Code Generation)


Generator


Generator.c, Generator.h


符号表 (Symbol Table)


SymTable


SymTable.c, SymTable.h


Lua


Lua 的 BNF


chunk ::= {stat 【;′】} 【laststat 【;′】】


block ::= chunk


stat ::= varlist =′ explist | </p> <p> functioncall | </p> <p> do block end | </p> <p> while exp do block end | </p> <p> repeat block until exp | </p> <p> if exp then block {elseif exp then block} 【else block】 end | </p> <p> for Name=′ exp ,′ exp 【,′ exp】 do block end |


for namelist in explist do block end |


function funcname funcbody |


local function Name funcbody |


local namelist 【=′ explist】 </p> <p> laststat ::= return 【explist】 | break</p> <p> funcname ::= Name { .′ Name} 【:′ Name】</p> <p> varlist ::= var { ,′ var}


var ::= Name | prefixexp 【′ exp】′ | prefixexp .′ Name </p> <p> namelist ::= Name { ,′ Name}


explist ::= {exp ,′} exp</p> <p> exp ::= nil | false | true | Number | String |...′ | function |


prefixexp | tableconstructor | exp binop exp | unop exp


prefixexp ::= var | functioncall | (′ exp)′


functioncall ::= prefixexp args | prefixexp :′ Name args </p> <p> args ::=(′ 【explist】 )′ | tableconstructor | String </p> <p> function ::= function funcbody</p> <p> funcbody ::=(′ 【parlist】 )′ block end</p> <p> parlist ::= namelist 【,′ ...′】 |...′


//代码效果参考:http://www.jhylw.com.cn/215437939.html

tableconstructor ::= {′ 【fieldlist】}′

fieldlist ::= field {fieldsep field} 【fieldsep】


field ::= 【′ exp】′ =′ exp | Name=′ exp | exp


fieldsep ::= ,′ |;′


binop ::= +′ |-′ | `′ | /′ |^′ | %′ |..′ |


<′ |<=′ | >′ |

and | or


unop ::= -′ | not |#′


Lua 5.1 Reference Manual —


最后有 Lua 的 BNF。


Lua Interpreter in C —


Lua Compiler in Lua —


Lua Interpreter in Lua —


— The LuaJIT Project


CC1 编译程序的符号表


#ifndef SYMTABLE_H


#define SYMTABLE_H


#include "lib.h"


#include "HashTable.h"


#include "Tree.h"


//


型态 Type 有:函数、结构与指针与基本型态


//


基本 : int x;


//


指标 : int px;


//


函数 : int total(int a【】) {...};


//


结构 : struct Person { ... };


typedef struct _Method {


char name;


char returnType;


Array params;


} Method;


typedef struct _Struct {


char name;


Array fields;


} Struct;


typedef union _Type {


Method pmethod;


Struct pstruct;


char pbtype;


} Type;


//


符号的值可能是 byte, int, float 或 pointer (包含 struct, method, type)


typedef union _Value {


BYTE bvalue;


int ivalue;


float fvalue;


void pvalue;


} Value;


//


变量符号: int x; Symbol(name=x, tag=VAR, type=int)


//


函数符号: int total(int a【】) {...}; Symbol(name=total, tag=METHOD, type=int)


//


结构符号: struct Person { ... }; Symbol(name=x, tag=ETYPE, type=int)


typedef struct _Symbol { //


符号记录


void scope; //


所属领域


char name; //


符号名称 (x, px, Person, total)


char tag; //


符号标记 (变量定义 VAR 函数定义 METHOD、结构定义 STRUCT)


Type type; //


符号的形态


Value value; //


符号的值


} Symbol;


typedef HashTable SymTable;


Symbol SymNew(void scope, char name, char tag);


void SymFree(Symbol s);


void TypeFree(Type type);


SymTable SymTableNew();


Symbol SymTablePut(SymTable table, Symbol sym);


Symbol SymTableGet(SymTable table, void scope, char name);


<code class="highlighter-hljs hljs language-cpp

相关文章
|
4天前
|
运维 持续交付 开发工具
深入浅出:GitOps在微服务架构中的应用
【10月更文挑战第26天】本文深入探讨了GitOps在微服务架构中的应用,介绍了其核心理念、自动化部署流程和增强的可观测性。通过实例展示了GitOps如何简化服务部署、配置管理和故障恢复,并推荐了一些实用工具和开发技巧。
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
2天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
18 1
|
4天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
23 1
|
6天前
|
前端开发 API UED
深入理解微前端架构:构建灵活、高效的前端应用
【10月更文挑战第23天】微前端架构是一种将前端应用分解为多个小型、独立、可复用的服务的方法。每个服务独立开发和部署,但共同提供一致的用户体验。本文探讨了微前端架构的核心概念、优势及实施方法,包括定义服务边界、建立通信机制、共享UI组件库和版本控制等。通过实际案例和职业心得,帮助读者更好地理解和应用微前端架构。
|
8天前
|
运维 监控 Serverless
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
17 1
|
14天前
|
运维 Cloud Native 持续交付
云原生技术在现代IT架构中的深度应用与挑战####
【10月更文挑战第17天】 本文深入剖析了云原生技术的精髓,探讨其在现代IT架构转型中的核心作用与面临的挑战。云原生不仅是一种技术实现,更是企业数字化转型的重要推手,通过容器化、微服务、持续集成/持续部署(CI/CD)等关键要素,重塑软件开发、部署与运维模式。文章首先概述了云原生的基本原则与核心组件,随后分析了其如何促进企业敏捷性、可扩展性和资源利用率的提升,同时也指出了在安全性、复杂性管理及人才技能匹配等方面存在的挑战,并提出了相应的对策建议。 ####
47 6
|
15天前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
12天前
|
前端开发 API UED
拥抱微前端架构:构建灵活、高效的前端应用
【10月更文挑战第17天】微前端架构是一种将前端应用拆分为多个小型、独立、可复用的服务的方法,每个服务可以独立开发、部署和维护。本文介绍了微前端架构的核心概念、优势及实施步骤,并分享了业界应用案例和职业心得,帮助读者理解和应用这一新兴架构模式。
|
17天前
|
存储 监控 前端开发
掌握微前端架构:构建未来前端应用的基石
【10月更文挑战第12天】随着前端技术的发展,传统的单体应用架构已无法满足现代应用的需求。微前端架构通过将大型应用拆分为独立的小模块,提供了更高的灵活性、可维护性和快速迭代能力。本文介绍了微前端架构的概念、核心优势及实施步骤,并探讨了其在复杂应用中的应用及实战技巧。