=============== JVM ================
nop 不做事情,但要占用时间
JVM 是基于堆栈的,所以提供很多栈指令
pop2: 从堆栈pop 2个字
swap: 交换栈两个字等等
指令应该是固定长度 1个字
http://yinwufeng.iteye.com/blog/757565
方法调用
压栈后调用
getstatic java/lang/System/out Ljava/io/PrintStream // 相当于传递 this
ldc "This is a sample program"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
NaN
IEEE 754 允许用特殊的位模式来表示不是一个数
IEEE 754中,用指数部分全一、小数部分非零表示NaN。以32位 IEEE 单精度浮点数的NaN为例,按位表示即:S111 1111 1AXX XXXX XXXX XXXX XXXX XXXX,S为符号位、A表示NaN的类型。如果 A = 1,则该数是quiet NaN;如果A为零、其余X部分非零,则是signaling NaN
http://zh.wikipedia.org/wiki/NaN
goto
goto 指令后整数是 offset, 跳的位置是 PC + offset
goto 跟的2个直接,就是前后可以跳 32k的offset
=============== 实际计算机 ================
分时工作方式 在程序停止的任意处把与程序相关的信息 ( 栈,局部变量,当前 PC等) 拷贝到主存;并加载另一个程序相关信息并运行
指令集优化 DMA支持用将大块数据从存储器移动到显卡
流水化
转移预测 计算机继续执行指令,产生结果放在流水线特殊位置,猜测正确才被copy 回相应处理器
超标量
同一周期执行多条不同的指令(对某一流水阶段进行备份)
存储器优化
cache
L1位于CPU 并以 CPU 的速度运行,L2 以前在靠近CPU的主板上
存储管理:
直接地址转化: 直接映射物理地址
页式地址转化:
=========== Power 体系结构 ======================
RISC
加速常用指令
增加不常用的指令会降低指令的执行性能 ( 计算机要检查 指令的寻址方式,需要昂贵的电路)
RISC
1) 指令固定长度
2) 指令数少,容易优化
Power 有数量较多的通用寄存器 (32) , ALU, FPU 都有状态/控制寄存器( CR, FPSCR)
有机器状态寄存器(MSR) 保存系统超级用户级别的重要信息
CPU 可以复制 CR, 用户不同的用户级程序同时运行
存储管理
逻辑地址由存储管理硬件转换
块地址转换: BAT 寄存器, 如果逻辑地址和 BAT标记的存储区对应,将条桌虚拟存储过程,直接访问物理地址(图形设备,其他IO)
cache 访问:
汇编:
寄存器多,并行性高。
RISC体系支持良好的流水化工作。对于 Pentium 因为指令可变,取指15字节 ,可能比取指1字节慢15倍
PowerPC G5有10个独立模块
1个交换单元
1个ALU
2个FPU
2个定点运算单元
2个载入存储单元
1个条件/系统寄存器单元
1个转移单元
能同事执行多大10条不同指令。一个智能编译器尝试混合不同指令类型的代码
==================== Intel Pentium ==================
AX,BX 等寄存器扩展到 32位
可以用实模式(1M内存,没有存储保护)
流水线: 486 5阶, P3 14阶 P4 24阶
并行操作
MMX (SIMD) , 寄存器 64字节,可以同时执行 8个字节的加法
宏指令被翻译成许多微指令,Pentium 是一个RISC芯片,各类执行单元的独立微操作按照 RISC设计
============= 微控制器 ===================
运行频率 20MHz, 64k存储器,存储器和外设都在同一个物理芯片上
Atmel AVR: Risc 芯片,2个字节,130条指令,32个通用寄存器,64个I/O寄存器都是8个带宽;不支持浮点
代码保存在 Flash (rom), PC 可字节定位; 程序运行在 RAM (AT90s2313是256字节);EEPROM(启动配置信息) 128字节
AVR实现简单的存储器-IO映像,写IO等价于在段都设置一个电气信号(有驱动芯片完成)
另外提供双向数据接口和计时电路,中断
很多引脚重叠,UART与端口B重叠
一般传输指令缺省对SRAM,但由于寄存器和IO都是存储体的一部分,所以没有区别,但算数运算只能和通用寄存
======= JVM 高级编程 ==============
数组创建
newarray 在堆中分配,而后把新数组地址压栈
anewarry 创建派生类对象 ( anewarryjava/lang/String)
multianewarry (multianewarry【【【F 3; 生成三维数组
存储指令 astore_1 , iastore
获取长度 arraylength
给对象域赋值
putfield BaseballPlayer/Name Ljava/lang/String;
putfield BaseballPlayer/Year I;
读取域
putstatic Example/PI D;
getfield BaseballPlayer/Year I; // load 压入栈顶
调用方法
getstatic java/lang/System/out Ljava/io/PrintStream
ldc "hello, world"
invoevirtual java/io/PrintStream/println(Ljavaa/langString;)V
创建对象
new MyClass
invokespecail MyClass/<init>()V
类系统支持递归,每次方法调用生成新的局部变量。不同于jsr/ret技术(使用原来堆栈)
|