12.基于栈的指令集与基于寄存器的指令集

2023-10-31

通过一个算术代码来了解栈的解释器执行过程

基于栈指令集Demo

演示1+1基于栈的指令集

        iconst_1
iconst_1
iadd
istore_0
      

两条iconst_1指令连续把两个常量压入栈后,iadd指令把栈顶的两个值出栈、相加、然后方位栈顶,最后istore_0把栈顶的值放到局部变量表的第0个solt中。

基于寄存器指令集Demo

同样演示1+1

        mov eax,1
add eax,1
      

mov指令把EAX寄存器的值设为1,然后add指令再把这个值加1,结果就保存在EAX寄存器里面。

两种方式各有优缺点,基于栈的指令集很明显可移植高,但是工作效率较低。而基于寄存器指令集寄存器由硬件直接提供,工作效率高,程序受硬件约束。

        public int calc(){
    int a=100;
    int b=200;
    int c=300;
    return (a+b)*c;
}
-------------------------------------------
Classfile /C:/Users/yssq/Desktop/Calc.class
  Last modified 2019-11-22; size 274 bytes
  MD5 checksum 2681512ec7a4d5b2f6ce595823b43360
  Compiled from "Calc.java"
public class me.zhyx.jvm.Calc
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#12         // java/lang/Object."<init>":()V
   #2 = Class              #13            // me/zhyx/jvm/Calc
   #3 = Class              #14            // java/lang/Object
   #4 = Utf8               <init>
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               calc
   #9 = Utf8               ()I
  #10 = Utf8               SourceFile
  #11 = Utf8               Calc.java
  #12 = NameAndType        #4:#5          // "<init>":()V
  #13 = Utf8               me/zhyx/jvm/Calc
  #14 = Utf8               java/lang/Object
{
  public me.zhyx.jvm.Calc();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 8: 0

  public int calc();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=4, args_size=1
         0: bipush        100 #单字节的整型常量值(-128-127)推入操作数栈顶
         2: istore_1          #将栈顶int型数值存入第二个局部变量
         3: sipush        200 #将一个短整型常量值(-32768~32767)推送至栈顶
         6: istore_2
         7: sipush        300
        10: istore_3
        11: iload_1           #将第三个int型局部变量推送至栈顶
        12: iload_2
        13: iadd              #将栈顶两int型数值相加并将结果压入栈顶
        14: iload_3
        15: imul
        16: ireturn           #从当前方法返回int
      LineNumberTable:
        line 10: 0
        line 11: 3
        line 12: 7
        line 13: 11
}
SourceFile: "Calc.java"
      


v2-7c1f5a8ab706a9a6f359d2b85bddcdcc_b.jpg
1



v2-7baaa173a4c93c11b860d9a1b4338c46_b.jpg
2



v2-15305c481590bcf6a819eba5d6931434_b.jpg
3



v2-a3a77af93899826c7ed90f137165fbdd_b.jpg
4

每一个早晨都是一个新的开始,

不要为昨日没有实现的目标而懊恼,

从此刻开始努力、加油!

祝好!

v2-52beccf2a41e2f6af26fb3ee97b18aa8_b.jpg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

12.基于栈的指令集与基于寄存器的指令集 的相关文章

随机推荐

  • PHP中的错误处理、异常处理机制

    http www cnblogs com cnbeir archive 2012 05 05 2484635 html 在编写php程序时 错误处理是一个重要的部分 如果程序中缺少错误检测代码 那么看上去很不专业 也为安全风险敞开了大门 例
  • Qt子类窗体和父类窗体的数据传递

    1 全局变量 extern 2 静态成员函数 static 3 信号槽 信号槽层层传递调用 爷爷类 gt 父类 gt 子类 但是父类的窗体如果是hide或者close是不能实现子类的信号传递给父类 在此处就已经传递不下去了 父类再传递给爷爷
  • gtest初识 - googletest(一)

    gtest是Google开发的一个开源单元测试框架 代码提供丰富的注释和实例 参考实际用例可以很快上手基本单元测试 丰富的代码注释能够让有兴趣的开发者深入了解gtest的代码结构并做部分针对性的二次开发 gtest主要针对c c 提供了针对
  • input属性placeholder在iOS中显示不完整的解决方法

    在一些高版本的ISO上设置placeholder显示的字体大小的时候 有时候会被遮挡掉一部分 出现原因 input 里面的字体大小小于placeholder的字体大小 解决方法 设置input字体大于placeholder的字体 input
  • 【Flutter】二维码生成,Widget转图片,图片保存相册

    文章目录 1 生成二维码 2 Widget转图片 3 图片保存至相册 1 生成二维码 使用qr flutter https pub dev packages qr flutter Container padding EdgeInsets o
  • Gitlab fork and code review 流程

    Gitlab fork and code review 1 CodeReview的目的 CodeReview的目的是提升代码质量 尽早发现潜在缺陷与BUG 降低修复成本 同时促进团队内部知识共享 帮助更多人更好地理解系统 2 git for
  • Qt 中的智能指针

    Qt 中的智能指针 上一篇博客中介绍了 C 11 标准中的提供的智能指针 在 Qt 中也提供了类似的替代功能 并且比 C 11 标准中提供的功能还要强大 所以如果我们使用 Qt 作为基础库 那么就没有必要使用C 11 的智能指针 Qt 的智
  • 【参考设计】CH340最新官方原理图2020-4-1

    USB转串口 最新精简原理图如下 CH340G CH340E CH340N CH340K
  • 蓝牙HCI 部分Command,Event

    一 HCI层 1 HCI Reset 将HCI复位到初始状态来重新初始化HCI层 2 HCI Read Buffer Size 读取HCI的缓冲区大小 以便确定其能够处理的数据量与数据 3 HCI Host Buffer Size 定义Ho
  • H3C 各类路由默认优先级

    转载于 https www cnblogs com fanweisheng p 11156746 html
  • 微信商城小程序怎么开通?

    随着移动互联网的快速发展 微信商城小程序成为了越来越多企业开启电商新模式的首选之一 微信商城小程序不仅在运营方式上具有很大优势 还能够提供更加便利和舒适的购物体验 那么微信商城小程序怎么开通呢 下面 我们将简单介绍微信商城小程序的开通流程
  • 神经网络与人工智能

    首先要简单区别几个概念 人工智能 机器学习 深度学习 神经网络 这几个词应该是出现的最为频繁的 但是他们有什么区别呢 来一张图就比较清楚了 如下图 人工智能 人类通过直觉可以解决的问题 如 自然语言理解 图像识别 语音识别等 计算机很难解决
  • 【数据库CS751:事务处理Transaction Processing,如何为远程并发访问的系统安全地执行组合更新】——并发性、锁与隔离

    目录 一 前言 二 并发性 1 数据库使用的典型架构 2 并发性 lt 1 gt 不相交数据事务 lt 2 gt Disjoint access parallelism DAP 不相交数据库并行 如何分辨数据的不相交性 3 并发性的解决 一
  • VTK-6.3.0编译(支持Qt编程)以及QVTKwidget插件安装

    重新整理一下VTK编译过程 尤其是涉及到Qt方面的选项配置 计算机系统 win10 x64 VTK版本 VTK 6 3 0 Qt版本 Qt 5 4 2 msvc 2013 x64 opengl Cmake版本 Cmake3 5 第一步 创建
  • 【结构与算法】—— 数据结构代码总结

    博客主页 https blog csdn net dxt19980308 欢迎点赞 收藏 留言 如有错误敬请指正 本文由肩匣与橘编写 首发于CSDN 生活依旧是美好而又温柔的 你也是 目录 线性表 1 1 顺序表 1 1 1 顺序表定义 1
  • CiteSpace关键词分析的可视化处理(三)

    1 调整好参数等 点击Go 运行 得到可视化窗口后 如下 进入可视化界面后 可以先点击a图标 进行聚类 如果得到的效果不好 可以点击聚类图标后面的T K或A来以不同的方式进行聚类 也可以点击LSI LLR MI USR用不同的算法来进行聚类
  • C程序编译过程浅析

    文章转载自 http smilejay com 2012 01 c compilation stages 前几天看了 程序员的自我修养 链接 装载与库 中的第二章 编译和链接 主要根据其中的内容简单总结一下C程序编译的过程吧 我现在一般都是
  • c++中函数参数传递(值传递、指针传递,引用传递)进一步认识

    ps 今天想写一个函数 从函数中把我需要的两个值传出来 由于传出来的值比较多 所以不考虑用return来返回 需要通过参数把修改后的值拉出来供我使用 很当然的就想到了用指针 但是值就是传不出来 使我对原有的大脑中指针的思维产生混沌感 今天一
  • 以太坊2.0 主网节点搭建最新详细教程

    文章目录 一 搭建准备 1 1 配置 JWT 身份验证 二 部署执行节点geth 2 1 下载geth基础镜像 2 2 geth容器生成 三 部署共识节点Prysm 3 1 下载Prysm镜像 3 2 Prysm容器生成 四 检查节点是否同
  • 12.基于栈的指令集与基于寄存器的指令集

    通过一个算术代码来了解栈的解释器执行过程 基于栈指令集Demo 演示1 1基于栈的指令集 iconst 1 iconst 1 iadd istore 0 两条iconst 1指令连续把两个常量压入栈后 iadd指令把栈顶的两个值出栈 相加