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

相关文章
|
1月前
|
数据处理 编译器 数据库
x64 和 arm64 处理器架构的区别
x64 和 arm64 处理器架构的区别
|
6天前
|
缓存 NoSQL Java
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
52 5
|
19天前
|
运维 Serverless Nacos
Serverless 应用引擎产品使用合集之在访问量过大的情况下,函数配置的cpu和内存会自动扩容吗
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
2天前
|
网络协议 安全 分布式数据库
技术分享:分布式数据库DNS服务器的架构思路
技术分享:分布式数据库DNS服务器的架构思路
7 0
|
2天前
|
Linux Perl
如何在Linux系统中确定CPU架构
如何在Linux系统中确定CPU架构
6 0
|
1月前
|
安全 编译器 程序员
CPU处理器模式与异常
CPU处理器模式与异常
90 0
|
1月前
|
Linux
Linux rsyslog占用内存CPU过高解决办法
该文档描述了`rsyslog`占用内存过高的问题及其解决方案。
96 4
|
1月前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
148 10
|
1月前
|
存储 弹性计算 固态存储
阿里云服务器CPU内存配置详细指南,如何选择合适云服务器配置?
阿里云服务器配置选择涉及CPU、内存、公网带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型e实例,如2核2G3M配置,适合低流量网站。企业用户则应选择企业级独享型ECS,如通用算力型u1、计算型c7或通用型g7,至少2核4G配置,公网带宽建议5M,系统盘可选SSD或ESSD云盘。选择时考虑实际应用需求和性能稳定性。
579 6