zoukankan      html  css  js  c++  java
  • 好玩的虚拟CPU执行代码

    虚拟CPU执行代码


    1. 读指令,将指令里的地址值写入到寄存器
    2. 计算指令,将寄存器里的
      值进行计算
    3. 返回结果,将计算结果写回寄存器里
    function add(x, y) {
      var z = x+y
      return z
    }
    console.log(add(1, 2))
    
    [generated bytecode for function: add (0x255c0824fe59 <SharedFunctionInfo add>)]
    Parameter count 3
    Register count 1
    Frame size 8
             0x255c08250006 @    0 : 25 02             Ldar a1 # 将a1寄存器中的值加载到累加器中,把1加入到累加器中
             0x255c08250008 @    2 : 34 03 00          Add a0, [0] # 将a0寄存器的值加载到累加器中,把2加入到累加器中并计算结果放入到累加器中
             0x255c0825000b @    5 : 26 fb             Star r0 # 把累加器中的值保存到r0寄存器中
             0x255c0825000d @    7 : aa                Return # 结束当前函数的执行,并将控制权传回给调用方,返回的值是累加器中的值
    Constant pool (size = 0)
    Handler Table (size = 0)
    Source Position Table (size = 0)
    
    function foo() {
      var d = 20
      return function inner(a, b) {
          const c = a + b + d
          return c
      }
    }
    const f = foo()
    f(1,2)
    
    [generated bytecode for function: foo (0x16f90824fe89 <SharedFunctionInfo foo>)]
    Parameter count 1
    Register count 1
    Frame size 8
             0x16f908250126 @    0 : 84 00 01          CreateFunctionContext [0], [1] # 创建函数上下文
             0x16f908250129 @    3 : 16 fb             PushContext r0 # 保存旧的上下文到r0寄存器中,然后把累加器中内容作为新的上下文
             0x16f90825012b @    5 : 0c 14             LdaSmi [20] # 加载20到累加器中
             0x16f90825012d @    7 : 1d 02             StaCurrentContextSlot [2] # 把累加器的值存储到上下文slot2号插槽 
             0x16f90825012f @    9 : 81 01 00 02       CreateClosure [1], [0], # 创建闭包,并存储到累加器中 #2
             0x16f908250133 @   13 : aa                Return 
    Constant pool (size = 2)
    
    [generated bytecode for function: inner (0x1fb4082500b5 <SharedFunctionInfo inner>)]
    Parameter count 3
    Register count 2
    Frame size 16
             0x1fb4082501ae @    0 : 25 02             Ldar a1 # 读a1寄存器的值1到累加器
             0x1fb4082501b0 @    2 : 34 03 00          Add a0, [0] # 与a0寄存器的值2相加,保存结果到累加器
             0x1fb4082501b3 @    5 : 26 fa             Star r1 # 将计算结果保存到r1寄存器
             0x1fb4082501b5 @    7 : 1b 02             LdaImmutableCurrentContextSlot [2] # 将上下文d的值读到累加器中
             0x1fb4082501b7 @    9 : 34 fa 01          Add r1, [1] # 与之前的结果相加
             0x1fb4082501ba @   12 : 26 fb             Star r0 # 将结果保存在r0
             0x1fb4082501bc @   14 : aa                Return # 返回计算结果
    Constant pool (size = 0)
    Handler Table (size = 0)
    Source Position Table (size = 0)
    
  • 相关阅读:
    webpack-dev-server报错
    npm run dev 报错 run `npm audit fix` to fix them, or `npm audit` for details
    vscode里使用.vue代码模板的方法
    console.log()中的%d,%s等代表的输出类型
    使用Babel将单独的js文件 中的 ES6转码为ES5
    jQuery选择什么版本 1.x? 2.x? 3.x?
    在线jquery.min.js、vue.min.js引用
    WebSocket对象的“readyState”属性记录连接过程中的状态值
    vue项目中,使用vue-awesome-swiper插件实现轮播图
    vue-cli 项目里屏幕自适应
  • 原文地址:https://www.cnblogs.com/pluslius/p/14904310.html
Copyright © 2011-2022 走看看