簡(jiǎn)單來(lái)說(shuō),指令集就是CPU能看得懂的語(yǔ)音,可以稱之為機(jī)器語(yǔ)言。
CPU指令集主要包括CISC(復(fù)雜指令集)和RISC(精簡(jiǎn)指令集)。
形象點(diǎn)說(shuō),
CISC類似于漢語(yǔ),每一句話都是由漢字組成,而每一個(gè)漢字就相當(dāng)于一條指令集;
RISC類似于英語(yǔ),每一句話都是由字母組成,而每一個(gè)字母就相當(dāng)于一條指令集;(這里不討論什么漢字是筆畫組成的,形象的比喻而已)
但是無(wú)論漢語(yǔ)和英語(yǔ),都能實(shí)現(xiàn)人類基本交流。
例如:英語(yǔ)雖然只有26個(gè)字母,但是漢字卻有幾千個(gè)。但是有時(shí)候翻譯表達(dá)同一個(gè)意思,往往比中文要復(fù)雜。比如中文的詩(shī)句,簡(jiǎn)單的幾個(gè)漢字,就可以描述此次此刻的心境。
指令集就是cpu能讀懂的指令,命令,就是人們預(yù)先定義好的,控制cpu如何工作的機(jī)器能讀懂的機(jī)器語(yǔ)言。
知道了什么是指令集,這個(gè)時(shí)候還有一個(gè)概念就是編譯。
編譯其實(shí)就是把高級(jí)語(yǔ)言編程機(jī)器語(yǔ)言。也就是二進(jìn)制的東西。燒錄openwrt的時(shí)候,用hex編輯器打開(kāi)看看,里面全是二進(jìn)制代碼,這些就是翻譯后的機(jī)器語(yǔ)言。(當(dāng)然,固件中處理指令集后,還有數(shù)據(jù),數(shù)據(jù)就是普通的資源文件,不會(huì)去控制cpu)。
MIPS指令集就是MIPS架構(gòu)的CPU能讀懂的語(yǔ)言。
MIPS匯編
MIPS指令集
MIPS指令集屬于精簡(jiǎn)指令集
MIPS的所有指令都是32位,指令格式簡(jiǎn)單,而X86的指令長(zhǎng)度不是固定的。
簡(jiǎn)單的指令和格式易于譯碼和流水線操作,但是代碼密度不高,導(dǎo)致二進(jìn)制文件大
MIPS有32個(gè)通用寄存器REG,為什么是32個(gè)而不是更多呢?
因?yàn)楦嗟募拇嫫餍枰嗟闹噶羁臻g對(duì)寄存器編碼,也會(huì)增加上下文切換的負(fù)擔(dān)。
MIPS指令格式
R格式
用處:
寄存器-寄存器ALU操作
I格式
用處:
加載/存儲(chǔ)字節(jié),半字,字,雙字
條件分支,跳轉(zhuǎn),跳轉(zhuǎn)并鏈接寄存器
讀寫專用寄存器
J格式
用處:
跳轉(zhuǎn),跳轉(zhuǎn)并鏈接
陷阱和從異常中返回
各字段含義:
op:指令基本操作,稱為操作碼。
rs:第一個(gè)源操作數(shù)寄存器。
rt:第二個(gè)源操作數(shù)寄存器。
rd:存放操作結(jié)果的目的操作數(shù)。
shamt:位移量;
funct:函數(shù),這個(gè)字段選擇op操作的某個(gè)特定變體。
例:
add $t0,$s0,$s1 1
表示$t0=$s0+$s1,即16號(hào)寄存器(s0)的內(nèi)容和17號(hào)寄存器(s1)的內(nèi)容相加,結(jié)果放到8號(hào)寄存器(t0)。
指令各字段的十進(jìn)制表示為:
MIPS指令
MIPS沒(méi)有棧操作指令 ,調(diào)用子程序時(shí)沒(méi)有自動(dòng)壓棧的call指令,只能用jal。
MIPS的內(nèi)存映射、中斷等功能都做到了協(xié)處理器0(cp0)中,浮點(diǎn)運(yùn)算做到了協(xié)處理器1(cp1)中。
MIPS的尋址方式最簡(jiǎn)單,僅有寄存器加偏移尋址方式。
MIPS常用指令集
lb/lh/lw: 從存儲(chǔ)器中讀取一個(gè)byte/half word/word的數(shù)據(jù)到寄存器中。如 lb 1,0([Math Processing Error]2)
sb/sh/sw: 把一個(gè)byte/half word/word的數(shù)據(jù)從寄存器存儲(chǔ)到存儲(chǔ)器中。如 sb 1,0([Math Processing Error]2)
add/addu:把兩個(gè)定點(diǎn)寄存器的內(nèi)容相加add 1,[Math Processing Error]2,3([Math Processing Error]1=2+[Math Processing Error]3);u為不帶符號(hào)加。 addi/addiu:把一個(gè)寄存器的內(nèi)容加上一個(gè)立即數(shù)add 1,[Math Processing Error]2,#3(1=[Math Processing Error]2+3);u為不帶符號(hào)加。
sub/subu:把兩個(gè)定點(diǎn)寄存器的內(nèi)容相減。
div/divu:兩個(gè)定點(diǎn)寄存器的內(nèi)容相除。
mul/mulu:兩個(gè)定點(diǎn)寄存器的內(nèi)容相乘。
and/andi:與運(yùn)算,兩個(gè)寄存器中的內(nèi)容相與and 1,[Math Processing Error]2,3([Math Processing Error]1=2 &[Math Processing Error]3);i為立即數(shù)。
or/ori:或運(yùn)算。
xor/xori:異或運(yùn)算。
beq/beqz/benz/bne:條件轉(zhuǎn)移eq相等,z零,ne不等。
j/jr/jal/jalr:j直接跳轉(zhuǎn);jr使用寄存器跳轉(zhuǎn);
lui:把一個(gè)16位的立即數(shù)填入到寄存器的高16位,低16位補(bǔ)零。
sll/srl:邏輯左移/右移sll 1,[Math Processing Error]2,#2。
slt/slti/sltui:如果2的值小于[Math Processing Error]3,那么設(shè)置1的值為1,否則設(shè)置[Math Processing Error]1的值為0。slt 1,[Math Processing Error]2,$3。
mov/movz/movn:復(fù)制,n為負(fù),z為零。mov 1,[Math Processing Error]2; movz 1,[Math Processing Error]2,3([Math Processing Error]3為零則復(fù)制2到[Math Processing Error]1)。
trap:根據(jù)地址向量轉(zhuǎn)入管態(tài)。
eret:從異常中返回到用戶態(tài)。
32個(gè)通用寄存器
0($zero): 永遠(yuǎn)返回值為0
1($at): 用做匯編器的暫時(shí)變量
2-3(v0?[Math Processing Error]v1): 子函數(shù)調(diào)用返回結(jié)果
4-7(a0?[Math Processing Error]a3): 子函數(shù)調(diào)用的參數(shù)
8-15(t0?[Math Processing Error]t7): 暫時(shí)變量,子函數(shù)使用時(shí)不需要保存與恢復(fù)
16-23(s0?[Math Processing Error]s7): 子函數(shù)寄存器變量。子函數(shù)必須保存和恢復(fù)使用過(guò)的變量在函數(shù)返回之前,從而調(diào)用函數(shù)知道這些寄存器的值沒(méi)有變化。
24-25(t8?[Math Processing Error]t9): 暫時(shí)變量,子函數(shù)使用時(shí)不需要保存與恢復(fù)
26-27(k0?[Math Processing Error]k1): 通常被中斷或異常處理程序使用作為保存一些系統(tǒng)參數(shù)
28($gp): 全局指針。一些運(yùn)行系統(tǒng)維護(hù)這個(gè)指針來(lái)更方便的存取“static“和”extern”變量。
29($sp): 堆棧指針
30(s8/[Math Processing Error]fp): 第9個(gè)寄存器變量。子函數(shù)可以用來(lái)做楨指針
31($ra): 子函數(shù)的返回地
cp0:協(xié)處理器0,MIPS對(duì)CPU的控制用cp0完成
add指令其實(shí)就是一條32位的“數(shù)據(jù)”,
bit0-bit5位命令號(hào),即100000,為add指令
rd則是bit11-bit15
rt則是bit16-bit20
rs則是bit21-bit25
指令的意思(Purpose)是,把rs與rt相加值富裕rd(Description)。這里的rX的意思是cpu的寄存器,一般cpu都有r0-r12個(gè)寄存器,是cpu計(jì)算臨時(shí)保存數(shù)據(jù)用的。
正常的數(shù)據(jù)是在ram中的,運(yùn)算過(guò)程是:cpu有一條指令把數(shù)據(jù)搬到cpu的寄存器,然后計(jì)算完畢,再搬回去ram中。add即讓cpu執(zhí)行加運(yùn)算,指令發(fā)給cpu后,cpu會(huì)調(diào)用內(nèi)部的累加器執(zhí)行加運(yùn)算。如果學(xué)過(guò)數(shù)字電路的可能會(huì)清楚累加器的電路。
評(píng)論