指令集

深入理解java虚拟机(11):基于栈的字节码解释执行引擎

给你一囗甜甜゛ 提交于 2019-11-26 10:15:43
1、解释执行 编译过程如下 2、基于栈的指令集和基于寄存器的指令集 java编译器输出的指令流,基本是一种基于栈的指令集架构,指令流中的大部分指令都是零地址,依赖于操作数工作。与之相对的是基于寄存器的指令集,也就是目前pc支持的指令集。两者的不同,举例如下: 1+1基于栈的指令集iconst_1,iconst_1,iadd,istore_0,基于寄存器的指令集 mov eax 1,add eax 1。基于栈的指令集主要优点就是可移植性强,寄存器由硬件直接提供,程序直接依赖于这些硬件。基于栈的指令集可以自行决定是否将频繁访问数据放到寄存器中获得更好的性能,代码紧凑,编译器实现更加简单。因为栈实现在内存中和指令数量,所以基于栈的指令集要慢些。 3、基于栈的解释执行过程 public int calc(){ int a=100; int b=200; int c=300; return (a+b)*c; } public int calc(): Code: Stack=2,Locals=4,Args_size=1 0:bipush 100 2:istore_1 3:sipush 200 6:istore_2 7:sipush 300 10:istore_3 11:iload_1 12:iload_2 13:iadd 14:iload_3 15:imul 16:ireturn

C为什么不能跨平台?

和自甴很熟 提交于 2019-11-26 09:22:41
本文参考于 https://www.cnblogs.com/jmsjh/p/7808764.html ,由于只是简单的做一些笔记,难免出错,请包涵。 还有很多内容没有记录,详细内容请参考原文! 关于C不能跨平台性的分析 不管是使用的IDE直接点击个运行按钮还是使用gcc命令进行编译(gcc -o hello hello.c) ,得到最后的输出结果。但是实际上hello world程序的编译是这样的(以hello world程序为例) 预处理阶段 :预处理器(cpp)把代码中#开头的行进行展开,比如头文件,宏扽分内容,修改最初的C文件。 编译阶段 :编译器(ccl)将修改后的C文件,翻译成了另外一个文本文件,hello.s 这就是所说的汇编程序了,不同的CPU和平台环境,编译输出的汇编代码也是不同的。 汇编阶段 :汇编器(as)将hello.s翻译成机器语言指令。把这些命令打包成一种叫做可重定位目标程序的格式。这其实就是二进制文件了。 链接阶段 :编译过程最后还有一个链接阶段(程序调用过了printf函数),最后输出结果还是和上一步相同,是一个直接二进制文件。 结合图片和文字描述我们可以很好的了解hello world程序的编译过程。接下来我们简单认识一些汇编语言。 汇编就是比二进制操作起来更简单高效的一种语言,编写好的汇编程序需要通过汇编器编译成0和1这样计算机就可以识别。

深入iOS系统底层之指令集介绍

蹲街弑〆低调 提交于 2019-11-26 03:32:53
不以规矩.不能成方圆。--《孟子·离娄上》 说到指令集以及CPU架构体系,大家就会想到计算机专业课程里面的计算机体系结构的方面的内容。既然课程中已经有了的内容我就不想那么枯燥的去复述一遍,而是先看一个类的定义: //定义寄存器编号 typedef enum : int { Reg0, Reg1, Reg2, Reg3 } RegNum; //定义系统调用编号 typedef enum : int { Int3 //设备输出,将寄存器Reg0中的内容输出到屏幕 } Interrupt; //定义指令索引 typedef int Instruct; /** 虚拟CPU类,模拟CPU所提供的指令。 虚拟CPU由4个寄存器和运算部件组成。四个寄存器的编号分别定义在RegNum中;运算部件提供了赋值、加减、比较、跳转9个指令。 */ @interface VCPU : NSObject //将一个常量值赋值给编号为reg的寄存器中。 -(void)moveFromConst:(int)val toReg:(RegNum)reg; //将编号为reg1的寄存器中的值赋值给编号为reg2的寄存器中。 -(void)moveFromReg:(RegNum)reg1 toReg:(RegNum)reg2; //将编号为reg的寄存器中的值赋值给地址为addr的内存中。 -(void