好玩的虚拟CPU执行代码
Posted pluscat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了好玩的虚拟CPU执行代码相关的知识,希望对你有一定的参考价值。
虚拟CPU执行代码
- 读指令,将指令里的地址值写入到寄存器
- 计算指令,将寄存器里的
值进行计算 - 返回结果,将计算结果写回寄存器里
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执行代码的主要内容,如果未能解决你的问题,请参考以下文章