指令集:一个给定体系结构所能理解的命令集合
Java为了可移植性,当初被设计成了依赖软件解释器interpreter。解释器的指令集instruction叫Java字节码bytecodes。
为了使得性能与C接近,Java现在将字节码编译成成本地指令集类似MIPS。但是编译过程比在C中靠后,所以Java编译器叫做JIT Just in Time.
典型的MIPS有32个寄存器
算数运算在MIPS中只发生在寄存器。
数据传输指令:在寄存器和内存间传输数据
小端:低地址放高位
如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本书使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。
;地址偏移 大端模式 小端模式
0x00 12(OP0)78(OP3)
0x01 34(OP1)56(OP2)
0x02 56(OP2)34(OP1)
0x03 78(OP3)12(OP0)
网络字节序:互联网使用的网络字节顺序采用大端模式进行编址。收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。可见多字节数值在发送前,在内存中数值应该以大端法存放。
主机字节序:根据处理器的不同而不同,如PowerPC处理器使用大端模式,而Pentuim处理器使用小端模式。在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放。
load:memory to register lw load word
lw $t0,8($s3):memory 的基地址存在$s3中,偏移地址为8。数据传输到$t0中
store:register to memory sw store word
sw $t0,48($s3) t0中的值写入说为基地址 偏移地址为48的内存中
算数指令一次可以操作两个寄存器,并进行运算。而数据传输指令一次只能读写一个操作数,并且不能进行运算。
addi add immediately addi $s3,$s3,4
MIPS寄存器型指令字段:
op(6 bits) rs(5) rt(5) rd(5) shamt(5) funct(6)
opcode;first reg source;second reg source;reg destination;shift amount;function
MIPS立即数型指令:
op(6) rs(5) rt(5) constant/address(16)
移位指令:
sll 左移 sll $t2,$s0,4 # reg $t2 = reg $s0 << 4 bits
and $t0,$t1,$t2 # reg $t0 = reg $t1 & reg $t2
条件分支指令
beq register1, register2, L1
bne register1, register2, L1
set on less than, or slt.slt $t0, $s3, $s4 # $t0 = 1 if $s3 < $s4 slti $t0,$s2,10 # $t0 = 1 if $s2 < 10
jump-and-link instruction (jal):跳转到某个地址的同时,把下一条指令的地址保存在$ra中 程序计数器
$a0–$a3: four argument registers in which to pass parameters参数寄存器
$v0–$v3: two value registers in which to return values返回值寄存器
$ra: one return address register to return to the point of origin返回地址寄存器
The jump register instruction jumps to the address stored in register $ra—which is just what we want. Thus, the calling program, or caller, puts
the parameter values in $a0–$a3 and uses jal X to jump to procedure X (sometimes named the callee). The callee then performs the calculations,
places the results in $v0 and $v1, and returns control to the caller using jr $ra.
MIPS寻址方式总结:
寄存器寻址:操作数为寄存器
基址 偏移寻址:操作数在内存中 地址是基址寄存器和常数的和
立即数寻址:操作数是指令中的常数
PC相对寻址:地址是PC计数器和常数的和
伪直接寻址:
编译器:compiler
汇编器:assembler汇编语言转换成目标文件。包括目标文件首部 ,正文段text segment,静态数据段,重定位信息段relocation,符号表symbol tables,调试信息
将代码和数据模块按符号放入内存;决定数据和指令标记的地址;修正内部和外部的引用
根据重定位信息和符号表解析未定义标记 链接器产生可执行文件,与目标文件具有相同的格式,但是不包含未解决的引用。
因为可执行文件executable file存放在磁盘中,所以操作系统需要将其读到内存中并启动执行。
1.读取可执行文件首部以确定正文段和数字段的大小
2.为正文和数据创建一个足够大的空间
3.把可执行文件中的指令和数据复制到相应的内存中
4.把主程序的参数复制到栈的顶部
5.初始化机器寄存器,将栈指针指向第一个空单元
6.跳转到启动例程,它将参数复制到参数寄存器并且调用程序的主例程。主例程返回时,启动例程调用exit()系统调用终止程序。
动态链接库:
JAVA
JAVA字节码 解释JAVA程序设计的指令集中的指令
JAVA虚拟机:能够用来解释JAVA字节码的软件
即时编译器JIT通过跟踪运行的程序来定位热点,能够在运行时把已译码部分的代码直接解释成宿主机上的机器语言