1、mips定址方式
mips架構的定址模式有暫存器定址、立即數定址、暫存器相對定址和pc相對定址4種,其中暫存器相對定址、pc相對定址介紹如下:
1.1、暫存器相對定址
這種定址模式主要被載入/儲存指令使用,其對乙個16位的立即數進行符號擴充套件,然後與指定通用暫存器的值相加,從而得到有效位址。
通用暫存器grp + 16位立即數做符號擴充套件 = 有效位址
1.2、pc相對定址
這種定址模式主要被轉移指令使用。在轉移指令中有乙個16位的立即數,將其左移2位並進行符號擴充套件,然後與程式計數器pc的值相加,可得到有效位址。
程式計數器pc + 16位立即數左移2位並做符號擴充套件 = 有效位址
2、mips指令集
2.1、mips指令特點
mips固定4位元組指令長度。
記憶體中的資料訪問(load/store)必須嚴格對齊(至少4位元組對齊)。
跳轉指令只有26位目標位址,加上2位對齊位,可定址28位定址空間,即256mb。
條件分支指令只有16位跳轉位址,加上2位對齊位,共18位定址空間,即256kb。
mips預設不把子函式的返回位址(就是呼叫函式的受害指令位址)存放到棧中,而是存放到$31($ra)暫存器中,這對那些葉子函式(在函式中不再呼叫其他函式的函式)有利。如果遇到巢狀函式,有其他機制處理。
流水線效應。mips採用了高度的流水線,其中乙個最重要的效應就是分支延遲效應。在分支跳轉語句後面的那條語句叫做分支延遲槽。實際上,在程式執行到分支語句時,當它剛把要跳轉到的位址填充好(填充到**計數器裡),還沒有完成本條指令時,分支語句後面的那個指令就已經執行了,其原因就是流水線效應 ---- 幾條指令同時執行,只是處於不同的階段。
流水線效應:
mov $a0, $s2
jalr strrchr
move $a0, $s0
在執行第2行跳轉分支時,第3行的move指令已經執行完了。因此,在上面指令序列中,strrchr函式的引數來自第3行的$s0,而不是第1行的$s2。
從流水線效應中可以看出,是否正確理解mips指令的這些特點會直接影響我們對mips程式逆向分析的結果,因此,我們需要熟悉把握這些特點。
2.2、指令格式
所有mips指令的長度相同,都是32位。為了讓指令的格式剛好合適,設計者做了折中:將所有指令定長,但是不同的指令有不同的格式。在mips架構中,指令的最高6位均為opcode碼,剩下的26位可以將指令分為3種型別,分別為r型、i型和j型。
r型指令用連續3個5位二進位製碼表示3個暫存器的位址,然後用1個5位二進位製碼表示移位的位數(如果未使用移位操作,則全為0),最後是6位的function碼(它與opcode碼共同決定r型指令的具體操作方式)。
i型指令則用連續2個5位二進位製碼表示2個暫存器的位址,然後是由1個16位二進位製碼表示1個立即數二進位製碼。
j型指令用26位二進位製碼表示跳轉目標的指令位址(實際的指令位址應為32位,其中最低2位為「00」,最高4位由pc當前位址決定)。
型別格式
ropcode(6)
rs(5)
rt(5)
rd(5)
shamt(5)
funct(6)
iopcode(6)
rs(5)
rt(5)
immediate(16)
jopcode(6)
address(26)
opcode: 指令基本操作,稱為操作碼。
rs: 第乙個源運算元暫存器。
rt: 第二個源運算元暫存器。
rd: 存放操作結果的目的運算元。
shamt: 位移量。
funct: 函式,這個字段選擇opcode操作某個特定變體。
3、彙編常用的指令
注意:$rd表示目的暫存器, $rs表示源暫存器,$rt表示作為中間快取的暫存器,"imm"表示立即數,「mem「表示ram中的一段記憶體,「offset"表示偏移量。
3.1、load/store指令
load/store指令有14條,分別是lb、lbu、lh、lhu、ll、lw、lwl、lwr、sb、sc、sh、sw、swl和swr。
以"l"開頭的都是載入指令,以"s"開頭的都是儲存指令,這些指令用於從儲存器中讀取資料,或者將資料儲存在儲存器中。
3.1.1、la(load address) 指令用於將乙個位址或標籤存入乙個暫存器。
語法例項
備註la $rd, label
la $t0, val_1
複製val_1表示的位址到$t0暫存器中,其中val_1是乙個label
3.1.2、li(load immediate)指令用於將乙個立即數存入乙個通用暫存器。
語法例項
備註lw $rt, offset($rs)
lw $s0, 0($sp)
"$s0 = mem[$sp+0]",相當於取堆疊位址偏移0記憶體word長度的值到$s0中
3.1.3、lw(load word) 指令用於從乙個指定的位址載入乙個word型別的值到乙個暫存器中。
語法例項
備註lw $rt, offset($rs)
lw $s0, 0($sp)
"$s0=mem[$sp+0];",相當於取堆疊位址偏移0記憶體word長度的值到$s0中
3.1.4、sw(store word)用於將源暫存器中的值存入指定的位址。
語法例項
備註sw $rt, offset($rs)
sw $a0,0($sp)
"mem[$sp+0]=$a0;",相當於將$a0暫存器中乙個word大小的值存入堆疊,且$sp自動堆疊
3.1.5、move指令用於暫存器之間值的傳遞。
語法例項
備註move $rt, $rs
move $t5, $t1
$t5=$t1;
3.2、算術運算指令
mips彙編指令的算術運算特點如下:
算術運算指令的所有運算元都是暫存器,不能直接使用ram位址或間接定址。
運算元大小都為word(4 byte)。
算術運算指令有21條,分別為add、addi、sub、subu、clo、clz、slt、slti、sltiu、sltu、mul、mult、madd、maddu、msub、msubu、div和divu,實現了加、減、比較、乘、乘累加、除等運算。
指令格式與例項
注釋add $t0,$t1,$t2
"$t0=$t1+$t2;",帶符號數相加
sub $t0,$t1,$t2
"$t0=$t2 - $t2;", 帶符號數相減
addi $t0,$t1,5
$t0 = $t1 + 5;
addu $t0,$t1,$t2
"$t0 = $t1 + $t2;",無符號數相加
subu $t0, $t1, $t2
"$t0 = $t2 - $t2;",無符號數相減
mult $t3, $t4
"$t3 * $t4", 把64 bits的積儲存到"lo,hi"中,即"(hi,lo)=$t3 * $t4;"
div $t5, $t6
"$lo=$t5/$t6", $lo為商的整數部分;"$hi=$t5 mod $t6", $hi為餘數
mfhi $t0
$t0 = $hi
mflo $t1
$t1 = $lo
mips中的li MIPS 程式設計系列總結
遇到的問題 mips 指令中輸入,輸出指令不熟悉,la,li,sys call 等指令之前沒有接觸過,迴圈的編寫中跳出循壞的條件經過多次實驗才成功。判斷條件不成立後不進行下面的操作這一功能仍在研究中。定址方式不熟悉,導致無法正確進行陣列的輸入與輸出。解決辦法 通過查閱資料,了解 mips 指令中的輸...
MIPS指令集 指令的格式
mips的指令是32位的,相當於一條指令的含義與操作細節完全由32個二進位制數完全決定。對32位二進位制數的不同劃分使用,構成了不同的指令格式。mips指令集有三種指令格式 r型指令,i型指令,j型指令 mips處理器 mips cpu 中,具有儲存功能的部件是暫存器,即cpu與記憶體的資料交換本質...
mips彙編時常用的巨集指令
mips公司最初設計的彙編器是乙個巨集偉的計畫,它能完成智慧型巨集的擴充套件,延遲槽填充,窺孔優化以及盡可能減少流水線堵塞而對複雜指令序列進行指令重組。不過其他的彙編器簡單多了,因為高階語言的先進編譯器技術已經可以完成這些優化工作。為了保持彙編 的相容性,同時為了讓彙編程式設計師輕鬆一點,所有的mi...