上一篇,我们顺利将 6502 指令翻译成 C 代码,并演示了一个案例。 现在,我们来完成最后的目标 —— 转换成 JavaScript。 中间码输出 我们之所以选择 C,就是为了使用 LLVM。现在来看看,生成的 LLVM 中间表示: ...
上一篇,我们决定使用 LLVM 来优化程序,并打算用 C 作为输入语言。现在我们来研究一下,将 6502 指令转换成 C 的可行性。 跳转支持 翻译成 C 语言,可比 JS 容易多了。因为 C 支持 goto,跳转可轻松实现。例如:...
第一篇 中我们曾提到,JavaScript 最终还得经过浏览器来解析。因此可以把一些优化工作,交给脚本引擎来完成。 现代浏览器的优化能力确实很强,但是,运行时的优化终归是有限的。如果能在事先实现,则可投入更多资...
上一篇,我们通过内置解释器的方案,解决任意跳转的问题。同时,也提到另一个问题:如果指令发生变化,又该如何应对。 指令自改 如果指令加载到 RAM 中,那就和普通数据一样,也是可以随意修改的。然而,对应的 J...
上一篇,我们用模拟流程的方式,解决了跳转问题。 不过静态跳转,好歹事先是知道来龙去脉的。而动态跳转,只有运行时才知道要去哪。既然流程都是未知的,翻译从何谈起? 动态跳转,平时出现的多吗?非常多!除了 ...
上一篇 我们讨论了跳转指令,并实现「正跳转」的翻译,但最终困在「负跳转」上。而且,由于线程模型的差异,我们不能 1:1 的翻译,必须对流程进行一些改造。 当初之所以选择翻译,而不是模拟,就是出于性能考虑。...
上一篇,我们发现大多数 6502 指令都可以直接 1:1 翻译成 JS 代码,但除了「跳转指令」。 跳转指令,分无条件跳转、条件跳转。从另一个角度,也可分: 静态跳转:目标地址已知 动态跳转:目标地址运行时才知道 为...
简版:https://www.cnblogs.com/index-html/p/6492418.html 前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念。为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学。 于是想了一个话...
前言 相信有很多同学和我一样,第一次碰到 LRU(Least Recently Used) 的这个解释「最近最少使用」都不知道是什么意思,用汤老师的话来说: 我真的感到匪夷所思啊! 最近是表示时间,最少是表示频度,拆开来都...
cron表达式讲解 参见该网址: https://www.cnblogs.com/GarfieldTom/p/3746290.html cron表达式只有专业技术人员才看得懂,普通人不知道表达式是什么意思, 有需求让我们将cron表达式翻译成普通人可以看懂的文字...
去年折腾的一个东西,之前 blog 里也写过,不过那时边琢磨边写,所以比较杂乱,现在简单完整地讲解一下。 前言 当时看到一本虚拟机相关的书,正好又在想 JS 混淆相关的事,无意中冒出个想法:能不能把某种 CPU 指...