計算機指令

指令集:一個給定體系結構所能理解的命令集合

算術運算指令保持三個操作數:爲了讓硬件簡化

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通過跟蹤運行的程序來定位熱點,能夠在運行時把已譯碼部分的代碼直接解釋成宿主機上的機器語言

發佈了24 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章