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