代码生成- 寄存器计算机

这篇具有很好参考价值的文章主要介绍了代码生成- 寄存器计算机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

寄存器计算机是目前最流行的机器体系结构之一。

  • 效率很高
  • 机器体系结构规整

机器基于寄存器架构:

  • 典型的有16、32或更多个寄存器,所有操作都在寄存器中进行
  • 访存都通过load/store进行,内存不能直接运算

寄存器计算机Reg的结构

  • 内存,存放溢出的变量(溢出是指寄存器放不下的变量)
  • 寄存器,进行运算的空间,假设有无限多个
  • 执行引擎,指令的执行

代码生成- 寄存器计算机

寄存器计算机的指令集(ISA)

指令的语法

s ->  movn n, r                将一个立即数赋值给一个寄存器(数据移动)

  ->  mov r1, r2                将一个寄存器的值赋值给另一个寄存器(数据移动)

  ->  load [x], r                 把内存中x的值读入到寄存器r中(访存)

  ->  store r, [x]                把一个数据从寄存器中写入到内存中(访存)

  ->  add r1, r2, r3           r3 = r1 + r2(算术运算)

  ->  sub r1, r2, r3           r3 = r1 - r2(算术运算)

  ->  times r1, r2, r3        r3 = r1 * r2(算术运算)

  ->  div r1, r2, r3            r3 = r1 / r2(算术运算)

注:[x]表示这样一个x是在内存当中的

变量的寄存器分配伪指令

Reg机器只支持一种数据类型int,并且给变量x分配寄存器的伪指令是

.int x

在代码生成阶段,假设Reg机器上有无限多个寄存器。

  • 因此每个声明变量和临时变量都会占用一个(虚拟)寄存器
  • 把虚拟寄存器分配到物理寄存器的过程称为寄存器分配

递归下降代码生成算法

从C--到Reg

代码生成- 寄存器计算机

注意:在栈式计算机中,每一个函数都是void类型,而此处寄存器计算机Gen_E(E)的返回值类型为R_t(寄存器类型)。

表达式的代码生成

不变式:表达式的值在函数返回的寄存器中

R_t Gen_E(E e)
{
    switch (e)
    {
    case n:
        r = fresh();    // 返回唯一的寄存器编号
        emit("movn n, r");
        return r;

    case id:
        r = fresh();
        emit("mov id, r");
        return r;

    case true:
        r = fresh();
        emit("movn 1, r");
        return r;
    
    case false:
        r = fresh();
        emit("movn 0, r");
        return r;

    case e1 + e2:
        r1 = Gen_E(e1);
        r2 = Gen_E(e2);
        r3 = fresh();
        emit("add r1, r2, r3");
        return r3;

    case e1 && e2:
        r1 = Gen_E(e1);
        r2 = Gen_E(e2);
        r3 = fresh();
        emit("and r1, r2, r3");
        return r3;   // 非短路

    default:
        break;
    }
}

语句的代码生成

Gen_S(S s)
{
    switch (s)
    {
    case id = e:
        r = Gen_E(e);
        emit("mov r, id");  // 假设此处id也在寄存器中
        break;
    
    case printi(e):
        r = Gen_E(e);
        emit("printi r");
        break;

    case printb(e):
        r = Gen_E(e);
        emit("printb r");
        break;

    default:
        break;
    }
}

类型的代码生成

不变式:只生成.int 类型

Gen_T(T t)
{
    switch (t)
    {
    case int:
        emit(".int");
        break;
    
    case bool:
        emit(".int");
        break;

    default:
        break;
    }
}

变量声明的代码生成

不变式:只生成.int 类型

Gen_D(T id; D)
{
    Gen_T(T);
    emit(" id");
    Gen_D(D);
}

程序的代码生成

不变式:只生成.int 类型

Gen_P(D S)
{
    Gen_D(D);
    Gen_S(S);
}

代码生成- 寄存器计算机

tip:将x = 1 + 2 + 3 + 4 画成抽象语法树,就可以理解对应产生的9条汇编级指令了。

如何运行生成的代码?

1、写一个虚拟机(解释器),这个虚拟机上就有无限个寄存器,我们可以用单链表存放寄存器,这个单链表可以无限长。

2、在真实的物理机器上运行:需进行寄存器分配

我们有无限多个虚拟寄存器(r1, ..., rn),但一台物理机上只有k1-km个寄存器,那么我们就需要把这些寄存器虚拟的映射到实际的物理机器上,如果还不够用的话,那么就需要有一些虚拟寄存器放到内存里(前面提到的“溢出”)

代码生成- 寄存器计算机

 文章来源地址https://www.toymoban.com/news/detail-403975.html

到了这里,关于代码生成- 寄存器计算机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vivado MIPS寄存器堆(含测试代码)

    本篇文章使用 Verilog 语言编写实现带有优先级的83译码器,含有设计代码和测试代码。 一、 寄存器堆 regfile 模块实现了 32个32位通用寄存器 。可以同时进行 两个寄存器的读操作 和 一个寄存器的写操作 。写操作是同步写,写使能信号(we)为1时有效,为0时无效;读操作可以

    2024年02月08日
    浏览(46)
  • STM32-串口通信波特率计算以及寄存器的配置详解

    处理器与外部设备通信的两种方式 并行通信 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 串行通信 传输原理:数据按位顺序传输 优点:占用引脚资源少 缺点:速度相对较慢 按照数据传送方向,分为: 单工 :数据传输只支持数据在一个方向上传输

    2024年02月05日
    浏览(99)
  • (超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)

    关于Flash,官方的解释为:Flash为32位宽的存储单元,可用于存储代码和数据常量。Flash模块位于微控制器内存映射中的特定基址……。而对于我们来说,只要知道Flash闪存区是一个掉电后也不会清除的数据存储地。(相信大家对于Flash闪存也有着一定 的了解了,我也不多说废话

    2023年04月19日
    浏览(49)
  • 【Verilog编程】线性反馈移位寄存器(LFSR)原理及Verilog代码实现

    移位寄存器 :指若干个寄存器排成一列,每个寄存器中存放1bit二进制数据(0或1),每个时钟周期向左或向右移动一个bit。下图所示为一个向右移动的移位寄存器。 反馈移位寄存器(Feedback Shift Register,FSR) :每个时钟脉冲,移位寄存器向右移动一位,则移位寄存器的左左侧就

    2024年02月15日
    浏览(55)
  • NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算

    原文:5 Computing with Register Machines 译者:飞龙 协议:CC BY-NC-SA 4.0 我的目标是表明天堂机器不是一种神圣的生命体,而是一种钟表(相信钟表有灵魂属性的人将制造者的荣耀归功于作品),因为几乎所有多种运动都是由一种最简单和物质力量引起的,就像钟表的所有运动都是由

    2024年01月20日
    浏览(105)
  • 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信  2.1 串口简要模式图  2.2 相关寄存器 (1)PCON、SCON、SBUF (2)IE、IPH、IP (3)配置T1定时器 2.3 波特率和系统时钟和TH1和TL1计算  3.串口通信简单收发使用代码   3.1 在STC-isp使用端口助手,从单片机发送字节  3.2 通过端口助手利用主

    2024年02月05日
    浏览(48)
  • IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

    目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 ccode_standard /scripts/bin/ccode_standard 次序 参数名 说明 1 address (./rfdig;.;..;./boot) 指定脚本执行路径(可以为脚本所在路径的任意相对路径) help 脚本使用帮助,打印说明信息 2 all 运行脚本后,脚本会解析

    2024年01月18日
    浏览(40)
  • 【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

    目录 前言: 一、中断优先级设置 二、中断相关寄存器(STM32-Cortex M3) 三、临界段代码保护 四、任务调度器的挂起和恢复 总结: 博客笔记根据正点原子视频教程编辑,仅供学习交流使用! ①中断概念回顾 让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中

    2024年02月10日
    浏览(53)
  • ZedBoard+AD9361_FPGA的PL端纯逻辑(verilog)配置控制9361(一)_初始化寄存器脚本文件生成

    由于9361的寄存器较多,首先利用AD936X Evaluation Software 软件,根据我们的项目需求,配置相应的功能参数,生成寄存器参数配置文件。 我建议大家选择安装AD936X Evaluation Software 2.1.3版本,下载安装软件,一路点击下一步即可完成安装。软件安装包:百度网盘  提取码:mww7 安装

    2024年02月13日
    浏览(43)
  • 【ADF4351】使用FPGA进行SPI寄存器配置、使用FPGA计算各个频率的频点,ADF4351配置程序

    输出频率范围:35 MHz至4,400 MHz 小数N分频频率合成器和整数N分频频率合成器 具有低相位噪声的VCO 可编程的1/2/4/8/16/32/64分频输出 典型抖动:0.3 ps rms EVM(典型值,2.1 GHz): 0.4% 电源:3.0 V至3.6 V 逻辑兼容性: 1.8 V 可编程双模预分频器:4/5或8/9 可编程的输出功率 RF输出静音功能

    2024年04月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包