首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设计基于堆栈的机器指令集?

如何设计基于堆栈的机器指令集?
EN

Software Engineering用户
提问于 2012-06-29 11:06:46
回答 2查看 984关注 0票数 3

基于堆栈的虚拟机(如CLR和JVM )有不同的指令集。在创建虚拟机的同时设计指令集有什么理论依据吗?例如,有JVM指令集将0-5的常量加载到堆栈中。

代码语言:javascript
复制
iconst_0
iconst_1
iconst_2
iconst_3
iconst_4
iconst_5

而在CLR中,有指令集将数字从0到8加载到堆栈上,如下所示

代码语言:javascript
复制
ldc.i4.0
ldc.i4.1
ldc.i4.2
ldc.i4.3
ldc.i4.4
ldc.i4.5
ldc.i4.6
ldc.i4.7
ldc.i4.8

为什么没有ldc.i4.9,如果有ldc.i4,为什么我们需要上面的操作码?还有其他类似的。

我很想知道,不同越南船民的操作码有何不同?是否有任何具体的理论来设计这些操作码,或者它完全是由VM本身的特性驱动的,还是依赖于高级语言结构?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2012-06-29 13:15:48

通常,指令集是通过检查为类似机器生成的代码来设计的,以确定哪些指令发生得最频繁。设计人员还将使用他们提出的指令编写编译器(或者至少是GCC的后端),以查看结果代码的效率(无论是在代码密度还是在执行速度方面)。我确信,CLR的设计者仔细研究了JVM,看看如何改进它,就像JVM的设计者从早期的VM (p-system,Forth,Smalltalk)中获得了洞察力一样。

一般ISA设计理论认为,最常用的操作码应该是最短的,因为这将导致最佳的代码密度(也是最好的性能,因为较短的指令往往更容易解码)。设计实际的编码方案(opcode+operand(S)+数据类型(S)+寻址模式(Art))完全取决于ISA架构师,是一门涉及大量经验的“黑人艺术”技能之一。

票数 4
EN

Software Engineering用户

发布于 2012-06-29 11:33:06

我只知道在指令集(ISA)设计中考虑问题的唯一一本书是,其他大多数关于CA的书只是提供了一个分类,而不是走得太远。

对于您手头的问题,您必须与代码的密度进行权衡。一个ldc.i4就足以提供这个功能,但是每次使用它,它都需要1字节的指令和4字节的常量。仅使用1字节指令就可以提供一些特殊用途的ldc.i4.xx,这有助于提高代码的密度。但是很明显,你只能有256个一个字节的指令,所以你必须明智地使用它们。

而VM的另一个因素(对于硬件实现来说,这个因素不太正确)是这样的特殊指令不仅在指令流中占据更少的位置(对缓存压力和速度都有好处),这些指令将比它们的等价指令执行得更快。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/154837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档