日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MIPS介绍与MIPS汇编的常用指令

發(fā)布時間:2025/3/20 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MIPS介绍与MIPS汇编的常用指令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

描述

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到$f31
  • Began:

    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。