好玩的虚拟CPU执行代码

Posted pluscat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了好玩的虚拟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)

以上是关于好玩的虚拟CPU执行代码的主要内容,如果未能解决你的问题,请参考以下文章

分享几个实用的代码片段(附代码例子)

来水一篇,写完就继续找找好玩的游戏,嘿嘿

托管代码和非托管代码

全虚拟化和半虚拟化的区别

jvm调优篇 > CPU占用率高内存泄漏内存溢出查错教程

分析定位占用CPU资源高的JVM线程