程序与技术分享: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

相关文章
|
8天前
|
SQL 存储 分布式计算
ODPS技术架构深度剖析与实战指南——从零开始掌握阿里巴巴大数据处理平台的核心要义与应用技巧
【10月更文挑战第9天】ODPS是阿里巴巴推出的大数据处理平台,支持海量数据的存储与计算,适用于数据仓库、数据挖掘等场景。其核心组件涵盖数据存储、计算引擎、任务调度、资源管理和用户界面,确保数据处理的稳定、安全与高效。通过创建项目、上传数据、编写SQL或MapReduce程序,用户可轻松完成复杂的数据处理任务。示例展示了如何使用ODPS SQL查询每个用户的最早登录时间。
29 1
|
10天前
|
消息中间件 监控 API
理解微服务架构:构建灵活和可扩展的应用
【10月更文挑战第7天】理解微服务架构:构建灵活和可扩展的应用
|
10天前
|
消息中间件 监控 API
深入理解微服务架构:构建可扩展与灵活的应用
【10月更文挑战第7天】深入理解微服务架构:构建可扩展与灵活的应用
24 0
|
1天前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
4天前
|
存储 监控 前端开发
掌握微前端架构:构建未来前端应用的基石
【10月更文挑战第12天】随着前端技术的发展,传统的单体应用架构已无法满足现代应用的需求。微前端架构通过将大型应用拆分为独立的小模块,提供了更高的灵活性、可维护性和快速迭代能力。本文介绍了微前端架构的概念、核心优势及实施步骤,并探讨了其在复杂应用中的应用及实战技巧。
|
2天前
|
运维 Go 开发者
Go语言在微服务架构中的应用与优势
本文深入探讨了Go语言在构建微服务架构中的独特优势和实际应用。通过分析Go语言的核心特性,如简洁的语法、高效的并发处理能力以及强大的标准库支持,我们揭示了为何Go成为开发高性能微服务的首选语言。文章还详细介绍了Go语言在微服务架构中的几个关键应用场景,包括服务间通信、容器化部署和自动化运维等,旨在为读者提供实用的技术指导和启发。
|
4天前
|
设计模式 测试技术 持续交付
架构视角下的NHibernate:设计模式与企业级应用考量
【10月更文挑战第13天】随着软件开发向更复杂、更大规模的应用转变,数据访问层的设计变得尤为重要。NHibernate作为一个成熟的对象关系映射(ORM)框架,为企业级.NET应用程序提供了强大的支持。本文旨在为有一定经验的开发者提供一个全面的指南,介绍如何在架构层面有效地使用NHibernate,并结合领域驱动设计(DDD)原则来构建既强大又易于维护的数据层。
19 2
|
5天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
24 3
|
6天前
|
负载均衡 Go API
探索Go语言在微服务架构中的应用与优势
在这篇技术性文章中,我们将深入探讨Go语言(又称为Golang)在构建微服务架构时的独特优势。文章将通过对比分析Go语言与其他主流编程语言,展示Go在并发处理、性能优化、以及开发效率上的优势。同时,我们将通过一个实际的微服务案例,详细说明如何利用Go语言构建高效、可扩展的微服务系统。
|
5天前
|
存储 消息中间件 人工智能
ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用
本文整理自2024年云栖大会阿里云智能集团高级技术专家金吉祥的演讲《ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用》。