指令集:一個給定體系結構所能理解的命令集合
算術運算指令保持三個操作數:爲了讓硬件簡化
Java爲了可移植性,當初被設計成了依賴軟件解釋器interpreter。解釋器的指令集instruction叫Java字節碼bytecodes。
爲了使得性能與C接近,Java現在將字節碼編譯成成本地指令集類似MIPS。但是編譯過程比在C中靠後,所以Java編譯器叫做JIT Just in Time.
典型的MIPS有32個寄存器
算數運算在MIPS中只發生在寄存器。
數據傳輸指令:在寄存器和內存間傳輸數據
大端: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中 程序計數器
PC:保存當前運行的指令地址jal將PC+4保存在$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.
棧指針:$sp 棧增長是按地址從高到低的順序
MIPS尋址方式總結:
寄存器尋址:操作數爲寄存器
基址 偏移尋址:操作數在內存中 地址是基址寄存器和常數的和
立即數尋址:操作數是指令中的常數
PC相對尋址:地址是PC計數器和常數的和
僞直接尋址:
編譯器:compiler
彙編器:assembler彙編語言轉換成目標文件。包括目標文件首部 ,正文段text segment,靜態數據段,重定位信息段relocation,符號表symbol tables,調試信息
鏈接器:linker
將代碼和數據模塊按符號放入內存;決定數據和指令標記的地址;修正內部和外部的引用
根據重定位信息和符號表解析未定義標記 鏈接器產生可執行文件,與目標文件具有相同的格式,但是不包含未解決的引用。
加載器: loader
因爲可執行文件executable file存放在磁盤中,所以操作系統需要將其讀到內存中並啓動執行。
1.讀取可執行文件首部以確定正文段和數字段的大小
2.爲正文和數據創建一個足夠大的空間
3.把可執行文件中的指令和數據複製到相應的內存中
4.把主程序的參數複製到棧的頂部
5.初始化機器寄存器,將棧指針指向第一個空單元
6.跳轉到啓動例程,它將參數複製到參數寄存器並且調用程序的主例程。主例程返回時,啓動例程調用exit()系統調用終止程序。
動態鏈接庫:
JAVA
JAVA字節碼 解釋JAVA程序設計的指令集中的指令
JAVA虛擬機:能夠用來解釋JAVA字節碼的軟件
即時編譯器JIT通過跟蹤運行的程序來定位熱點,能夠在運行時把已譯碼部分的代碼直接解釋成宿主機上的機器語言