硬體設計的三原則:
2.1計算機硬體的操作加法和減法,都是三操作數
注釋用#開頭
所有的算術運算都是這樣的形式
設計原則一:簡單源於規整
2.2 計算機硬體的操作數寄存器的訪問速度比主存快得多
對主存儲器數據的操作要用
取數指令lw (load word)
存數指令sw (store word)。
編譯器必須儘量使用寄存器訪問變量
2.2.2常數或立即數操作數2.3有符號數和無符號數二進位無符號整數
範圍: 0 to +2n – 1
二進位補碼表示有符號整數
2n – 1 to +2n – 1 – 1
2.4 計算機中指令的表示指令系統對指令系統的要求:
完備性: 指令齊全,編程方便
高效性:佔內存少,運行省時
規整性:指令與運算規則統一
兼容性:新舊機指令軟體兼容
MIPS欄位:
- 指令欄位
R-型(寄存器)操作舉例
add $t0, $s1, $s2
I型(立即數指令)
立即數的算術和讀數/存數指令
地址:偏移加上rs中的基址
設計原則3:優秀的設計需要適宜的折中方案
2.5 邏輯操作對位進行處理的指令
用於對字中的若干 「位」
打包和拆包的操作
移位操作
shamt: 移多少位
邏輯左移sll
邏輯右移srl
「與」操作
and $t0, $t1, $t2
「或」操作
按位「取反」操作
用於改變字中的一些位
MIPS 3-操作數指令NOR
2.6 決策指令如果條件為真,跳轉到被標籤的指令執行
beq rs, rt, L1
bne rs, rt, L1
if (rs != rt)轉到標籤為L1的指令執行;
j L1
2.6.1循環
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit: …
while (save[i] == k)
i += 1;
Loop: sll $t1, $s3, 2
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
j Loop
Exit: …
寄存器的使用
$a0 – $a3: 傳遞參數 (reg’s 4 – 7)
$v0, $v1: 返回結果值 (reg’s 2 and 3)
$t0 – $t9: 臨時寄存器
$s0 – $s7: 保存參數
$gp: 靜態數據的全局指針寄存器(reg 28)
$sp: 棧指針寄存器stack pointer (reg 29)
$fp: 幀指針寄存器(frame pointer) , 保存過程幀的第一個字 (reg 30)
$ra:返回地址寄存器 return address (reg 31)
過程調用指令
過程調用:跳轉和連結
jal ProcedureLabel
下一條指令的地址在寄存器$ra中
跳轉到目標地址
過程返回:寄存器跳轉 jump register
jr $ra
拷貝$ra到程序計數器
也被用於運算後跳轉
2.8 MIPS中32位立即數和尋址2.8.1 32位立即數lui rt, constant
取立即數並放到高16位
註:Ori立即數或,$ s0與常數2304「或」,結果放在$s0形成一個32位的常數
2.8.2分支和跳轉中的尋址分支指令說明
操作碼,兩個寄存器,兩個地址
大多數跳轉目標離跳出的位置較近
向前或向後
PC相對尋址
目標地址 = PC + offset × 4
此時PC的增加量是4的倍數
跳轉(j和jal)的目標地址可以在代碼段的任何位置
指令除op外,指令其它欄位都是地址
直接跳轉到地址
Target address = PC31…28 : (address × 4)
2.8.3 MIPS尋址模式總結2.9並行與指令:同步處理器共享存儲器同一區域
P1 寫, P2 讀
(任務1寫的結果是任務2要讀取得值)
如果P1和P2不同步,將發生數據競爭
結果由訪問次序決定
依賴硬體提供同步指令
例如:lock和unlock指令,控制一個「互斥區」
原子讀/寫內存操作
在讀和寫之間,不再允許對該空間的其他操作
可以是單一的指令
例如寄存器和內存之間的原子交換
或者指令的原子配對
2.10 翻譯並執行程序編譯器:編譯器將C程序轉換成一種機器能理解的符號形式的彙編語言程序
彙編器:
彙編器(或編譯器)把程序翻譯成機器語言提供從部分構建完整程序的信息
目標文件頭:描述目標文件其他部分的大小和位置
正文段:翻譯後的指令,包含機器語言代碼
靜態數據段:包含在程序生命周期內分配的數據
重定位信息:標記了一些程序加載進內存時依賴於絕對地址的指令和數據
符號表:全局定義和外部引用
調試信息:用於關聯源文件
5.初始化寄存器(包括堆棧指針s p , 幀 指 針 sp, 幀指針sp,幀指針fp, 全局指針$gp )
6.跳轉到啟動進程
動態連結庫:
調用時,只是連接或裝入庫文件
乘指令長度的操作變成移位操作
編譯器可以獲得和手動使用指針相同的效果