MIPS介绍与MIPS汇编的常用指令
描述
CTF做題時會遇見MIPS匯編的題目,而我們接觸的是8086匯編,IDA是不能反匯編的需要自己了解一些MIPS方面的知識;
1. List 1
在不同的設(shè)備中,匯編語言對應(yīng)著不同的機器語言指令集,通過匯編過程轉(zhuǎn)換成機器指令。普遍地說,匯編語言和特定的機器語言指令集是一一對應(yīng)的,不同平臺之間不可直接移植。
1. List 1.5
8086 CPU介紹
Intel 8086是一個由Intel于1978年所設(shè)計的16位微處理器芯片,是x86架構(gòu)的鼻祖。
對于現(xiàn)今的機器來講,8086CPU它已經(jīng)屬于古玩。但是,現(xiàn)在的任何一臺PC機中的微處理器,只要是和 Intel兼容的系列,都可以8086的方式進行工作。可以將一個奔騰系列的微處理器當作一個快速的8086微處理器來用。整個奔騰PC的工作情況也是如此,可以當作一臺高速的8086PC來用。
2. List 2
MIPS是(Microcomputer without interlocked pipeline stages)的縮寫,含義是無互鎖流水級微處理器。MIPS采用的是精簡指令系統(tǒng)計算結(jié)構(gòu)(RISC結(jié)構(gòu))(與之對應(yīng)的:(復雜指令集)CISC結(jié)構(gòu))。RISC比CISC的設(shè)計更加簡單,由于其授權(quán)費用低,被INTEL外的大多數(shù)廠商使用。同時在設(shè)計理念上MIPS強調(diào)軟硬件協(xié)同提高計算機性能,并簡化硬件設(shè)計。
MIPS 是最早的,最成功的RISC處理器之一,MIPS處理器廣泛的應(yīng)用于:數(shù)字電視、機頂盒、藍光播放器、游戲機、網(wǎng)絡(luò)設(shè)備。
3. List 3
MIPS寄存器
MIPS 包含32個通用寄存器 ($0-$31均為32 位), 硬件沒有強制性的指定寄存器使用規(guī)則,但是在實際使用中,這些寄存器的用法都遵循一系列約定,寄存器約定用法引入了一系列的寄存器約定名。在使用寄存器的時候,要盡量用這些約定名或助記符,而不直接引用寄存器編號。
(1)兩個特殊寄存器:
$0:不管你存放什么值,其返回值永遠是零。 $ 31:永遠存放著正常函數(shù)調(diào)用指令(jal)的返回地址。(2)$at :
由編譯器生成的復合指令使用(3)$v0, $v1:
用來存放一個子程序 (函數(shù)) 的非浮點運算的結(jié)果或返回值。如果這兩個寄存器不夠存放需要返回的值,編譯器將會通過內(nèi)存來完成。(4)$ a0-a3:
用來傳遞子函數(shù)調(diào)用時前4個非浮點參數(shù)。(5)$ t0-t9:
依照約定,一個子函數(shù)可以不用保存并隨便的使用這些寄存器。在作表達式計算時,這些寄存器是非常好的暫時變量。當調(diào)用一個子函數(shù)時,這些寄存器中的值有可能被子函數(shù)破壞掉。所以也是最不安全的。(6)$ s0-s8:
依照約定,子函數(shù)必須保證當函數(shù)返回時這些寄存器的內(nèi)容必須恢復到函數(shù)調(diào)用以前的值, 或者在子函數(shù)里不用這些寄存器或把它們保存 在堆棧上并在函數(shù)退出時恢復。 這種約定使得這些寄存器非常適合作為寄存器變量、或存放一些在函數(shù)調(diào)用期間必須保存的原來的值。(類比:x86匯編中的函數(shù)序言和函數(shù)尾聲)
(7)$ k0, k1:
被OS的異常或中斷處理程序使用。被使用后將不會恢復原來的值。因此它們很少在別的地方被使用。(8)$gp:
如果存在一個全局指針,它將指向運行時決定的靜態(tài)數(shù)據(jù)(static data)區(qū)域的一個位置。這意味著,利用gp作基指針,在gp指針32K左右的數(shù) 據(jù)存取,系統(tǒng)只需要一條指令就可完成(9)$ sp:
堆棧指針的上下需要顯 式的通過指令來實現(xiàn)。因此 MIPS通常只在子函數(shù)進入和 退出的時刻才調(diào)整堆棧的指針。 這通過被調(diào)用的子函數(shù)來實現(xiàn)。SP通常被調(diào)整到這個被調(diào)用的子函數(shù)需要的堆棧的最低的地方,從而編譯器可以通過相對sp的偏移量來存取堆棧上的堆棧變量。
(10)$ fp(另外的約定名是s8):
fp作為框架指針可以被函數(shù)用來記錄堆棧的情況,在一 個過程中變量相對于函數(shù)指針的偏移量是不變的。(相對地址)一些編程語言顯示的支持這一點。匯編編程員經(jīng)常會利用fp的這個用法。C語言的庫函數(shù)alloca()就是利用了fp來動態(tài)調(diào)整堆棧的。
(11)$ ra:
當調(diào)用任何一個子函數(shù)時,返回地址存放在ra寄存器中,因此通常 一個子程序的最后一個 指令是: jr ra.子函數(shù)如果還要調(diào)用其他的子函數(shù),必須保存ra的值,通常通過堆棧。(12)其他方面:
MIPS里沒有狀態(tài)碼。CPU狀態(tài)寄存器或內(nèi) 部都不包含任何用戶程序計算的結(jié)果狀態(tài)信息。hi 和 lo 是與乘法運算器相關(guān)的兩個寄存器,是用來存放結(jié)果的地方。 它們并不是通用寄存器,除了用在乘除法之 外,也不能有做其他用途。 MIPS里定義了一些指令可以往hi和lo里存入任何值。浮點運算協(xié)處理器 (浮點加速器,FPA),如果存在的話,有32個浮點寄存器。按匯編語言的簡單約定講, 是從$ f0到$f31Began:
ADDIU(DADDIU) : 把一個寄存器的內(nèi)容加上一個無符號的立即數(shù)(賦值) DADDIU R1,R2,#3
XORI 一個寄存器中的內(nèi)容與一個立即數(shù)異或 (異或運算) XORI R1,R2,#3
CTF做了一到MIPS匯編的題目是這樣的:看懂之后就可以編寫python解題腳本了;
str1 = 'cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ'flag = ''for i in str1:flag += chr(ord(i)^0x37)print(flag)除了以上兩個指令這道題目中還出現(xiàn)了:
1. LW 從存儲器中讀取一個字的數(shù)據(jù)到寄存器中 LW R1, 0(R2)
2. LB 從存儲器中讀取一個字節(jié)的數(shù)據(jù)到寄存器中 LB R1, 0(R2)
3. DSLL 雙字邏輯左移 DSLL R1,R2,#2
4. DSRA 雙字算術(shù)右移 DSRA R1,R2,#2
5. BEQ 條件轉(zhuǎn)移指令,當兩個寄存器內(nèi)容相等時轉(zhuǎn)移發(fā)生 BEQ R1,R2
匯總
總結(jié)
以上是生活随笔為你收集整理的MIPS介绍与MIPS汇编的常用指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: glance-50(秒解秒懂)
- 下一篇: 异或运算讲解