MIPS匯編快速入門 【龍芯】

一、前言:MIPS與龍芯的淵源

MIPS(Microprocessor without Interlocked Pipelined Stages)是一種經典的RISC(精簡指令集)架構,以流水線高效、指令簡潔、低功耗為特點。龍芯(Loongson)系列處理器(如LS1E、LS1F、LS2K等)早期基于MIPS架構擴展設計,因此掌握MIPS匯編是理解龍芯底層驅動開發(如BSP、設備驅動)的基礎。本文結合龍芯硬件特性,從寄存器、指令格式到實戰示例,快速入門MIPS匯編。

二、核心基礎:MIPS寄存器架構

MIPS架構采用32個32位通用寄存器(GPR),部分寄存器有特殊用途。在龍芯開發中,需重點關注以下幾類:

1. 通用寄存器($0~$31)

寄存器編號匯編名稱用途說明(龍芯開發場景)
$0$zero恒為0,用于賦初值或比較
$8~$15$t0 ~ $t7“臨時寄存器" (Temporary)
$16~$23$s0 ~ $s7“保存寄存器” (Saved),函數調用需保存
$gp$28“全局指針” (Global Pointer)
$sp$sp“棧指針” (Stack Pointer)
$ra$31“返回地址” (Return Address),用于函數調用

龍芯實戰意義:在驅動開發中(如vxbMipsInt.c的中斷處理),需嚴格遵守寄存器使用約定(如臨時寄存器無需保存,保存寄存器需入棧),避免破壞上層調用上下文。

2. 特殊寄存器(核心控制)

程序計數器(PC):存儲當前執行指令地址,MIPS指令按4字節對齊(PC+4指向下一條指令)。
狀態寄存器(CP0 Status):控制中斷使能(IE位)、異常處理等,龍芯中斷控制器(如mipsLsnIntCtlr)需通過修改該寄存器開關全局中斷。
異常基地址寄存器(CP0 EBase):指定異常/中斷處理程序入口,龍芯BSP初始化時需配置該寄存器指向中斷向量表。

三、指令格式:MIPS的3種基礎類型

MIPS指令長度固定為32位,按功能分為3類,格式如下:

1. R型(寄存器型)

格式:op(6位) | rs(5位) | rt(5位) | rd(5位) | shamt(5位) | funct(6位)
功能:寄存器間運算(如加法、邏輯運算)。
示例:

add $t0, $s0, $s1  ; $t0 = $s0 + $s1(op=0,funct=0x20

2. I型(立即數型)

格式:op(6位) | rs(5位) | rt(5位) | immediate(16位)
功能:含立即數的運算、數據傳輸、條件分支。
示例:

lw $t0, 0x10($gp)   ; 從地址$gp+0x10加載字到$t0(op=0x23,rt=$t0)
addiu $t1, $t0, 4   ; $t1 = $t0 + 4(無符號立即數加法,op=0x09)
beq $t0, $zero, loop ; 若$t0==0,跳轉到loop(op=0x04

3. J型(跳轉型)

格式:op(6位) | target(26位)
功能:無條件跳轉、函數調用。
示例:

j main          ; 跳轉到main標簽(op=0x02)
jal func        ; 調用func函數,$ra = PC+4(op=0x03

四、常用指令:從數據操作到控制流

1. 數據傳輸指令(核心!)

MIPS通過加載/存儲(Load/Store) 指令訪問內存,龍芯硬件(如UART、PCI控制器)的寄存器讀寫依賴此類指令。

指令功能示例(龍芯場景)
lw rt, imm(rs)從內存rs+imm加載32位字到rtlw t0,0xbf002000(t0, 0xbf002000(t0,0xbf002000(zero) ; 讀取PCI控制器寄存器(地址0xbf002000)
sw rt, imm(rs)將rt的32位字存儲到rs+immsw t0,0xbf003204(t0, 0xbf003204(t0,0xbf003204(zero) ; 寫入中斷邊沿觸發寄存器(如GS1SOC_INT_EDGE)
lb/lh加載字節/半字(帶符號)-
sb/sh存儲字節/半字-

2. 算術與邏輯指令

指令功能示例
add rd, rs, rt加法(可能溢出)add $t0, $s0, $s1
addu rd, rs, rt無符號加法(不溢出)addu $t0, $t1, $t2
sub rd, rs, rt減法sub $t0, $s0, $s1
and/or/xor按位與/或/異或and $t0, $t1, $t2
sll/srl邏輯左移/右移sll $t0, $t1, 2 ; $t0 = $t1 << 2

3. 控制流指令

驅動中的條件判斷、循環、中斷處理依賴控制流指令:

指令功能示例(龍芯中斷處理)
beq rs, rt, label若rs==rt,跳轉到labelbeq $t0, $zero, int_end ; 若中斷標志為0,結束處理
bne rs, rt, label若rs!=rt,跳轉bne $v0, $zero, error
j label無條件跳轉j isr_handler ; 跳轉到中斷服務程序
jal label調用函數($ra=PC+4)jal pci_int_ack ; 調用PCI中斷確認函數
jr rs從寄存器rs跳轉(用于函數返回)jr $ra ; 返回到調用處

五、實戰示例:龍芯PCI中斷處理片段

PCI中斷處理邏輯,用MIPS匯編實現核心步驟(簡化版):

場景:清除PCI中斷標志(地址0xbf003214)

函數:clear_pci_int()

clear_pci_int:li $t0, 0xbf003214       ; $t0 = 中斷清除寄存器地址(GS1SOC_INT_CLR)li $t1, 0x10000          ; $t1 = PCI_INTA_STATUS(中斷標志位)sw $t1, 0($t0)           ; 寫入寄存器,清除中斷jr $ra                   ; 返回

解析:
li $t0, 0xbf003214:用立即數加載指令(偽指令,實際轉為lui+ori)將寄存器地址存入$t0。
sw $t1, 0($t0):通過存儲指令清除中斷標志,對應C代碼IO_WRITE32(GS1SOC_INT_CLR, PCI_INTA_STATUS)

六、龍芯開發注意事項

內存對齊:MIPS要求字(32位)訪問必須對齊到4字節邊界,否則觸發異常。龍芯硬件寄存器(如UART、PCI控制器)均按此設計,匯編中需確保lw/sw地址對齊。
中斷上下文:中斷服務程序(ISR)需快速執行,通常僅保存臨時寄存器(t0?t0~t0?t7),通過addiu $sp, $sp, -4*8入棧,處理完成后出棧恢復。
工具鏈:龍芯MIPS開發常用mipsel-linux-gcc編譯,objdump -d反匯編查看機器碼與匯編對應關系,輔助調試驅動中的匯編片段。

七、總結

MIPS匯編是龍芯底層開發的“語言鑰匙”,掌握寄存器架構、指令格式和常用操作,即可看懂BSP驅動(如hwconf.c的硬件配置)、優化中斷響應(ISR)。后續可深入學習MIPS異常處理、協處理器(CP0/CP1)編程,進一步理解龍芯硬件加速特性。從簡單的寄存器讀寫到復雜的驅動邏輯,MIPS匯編是連接軟件與龍芯硬件的橋梁。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94740.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94740.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94740.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何對springboot mapper 編寫單元測試

如何對springboot mapper 編寫單元測試在 Spring Boot 中對 MyBatis Mapper 編寫單元測試的核心目標是??隔離真實數據庫依賴??&#xff0c;驗證 SQL 邏輯與數據庫交互的正確性。以下是完整的實踐指南&#xff0c;涵蓋環境配置、測試數據初始化、具體測試用例編寫及常見問題…

學習游戲制作記錄(數據加密以及主菜單和畫面優化)8.27

1.實現數據加密FileDataHandler 腳本&#xff1a;private bool encryptData false;//是否加密public string codeWord "alexdev";//加密碼public FileDataHandler(string _dataDirPath, string _fileName, bool _encryptData){dataDirPath _dataDirPath;FileName …

五自由度磁懸浮軸承同頻振動抑制:從機理拆解到傳遞函數驗證的核心方案

摘要 五自由度磁懸浮軸承憑借無摩擦、高轉速的優勢,在航空航天、透平機械等領域應用廣泛,但轉子不平衡質量引發的同頻振動(頻率與轉子轉速一致)始終是制約其精度的核心痛點。本文從轉子不平衡振動的物理機理出發,詳細推導不平衡力的數學模型,分析位移輸出中擾動信號的疊…

CSS 優先級:公司組織架構模型

為什么我的CSS樣式不生效&#xff1f; 在網頁開發中&#xff0c;你可能經常會遇到一個令人困惑的問題&#xff1a;你明明寫了CSS代碼&#xff0c;但是樣式卻不生效&#xff0c;或者出現了意想不到的沖突。你可能會反復檢查代碼&#xff0c;卻找不到任何語法錯誤。這背后隱藏的原…

Go語言循環語句全解析

循環語句概述循環語句在編程中的作用循環語句是編程中控制程序流程的重要結構&#xff0c;它允許我們重復執行特定代碼塊&#xff0c;直到滿足終止條件。在數據處理、算法實現、系統監控等場景中&#xff0c;循環都發揮著關鍵作用。典型應用場景&#xff1a;數據處理&#xff1…

基于NXP iMXRT600音頻算法開發方法

iMXRT600 是一款高性能的微控制器&#xff0c;在開發音頻算法時可按以下步驟和方法進行&#xff1a;1. 開發環境搭建硬件平臺準備好 iMXRT600 開發板&#xff0c;確保開發板上具備音頻輸入輸出接口&#xff0c;如 I2S&#xff08;Inter - IC Sound&#xff09;接口用于音頻數據…

怎么理解API?

想象一下你去一家餐廳吃飯。你&#xff08;用戶&#xff09;不會直接走進廚房告訴廚師怎么做菜&#xff0c;對吧&#xff1f;你會怎么做&#xff1f;你會拿起菜單&#xff0c;查看上面列出的菜品&#xff08;例如“意大利面”&#xff09;、它們的描述和價格。然后&#xff0c;…

系統架構設計師備考第7天——網絡協議中間件軟件構件

一、網絡協議 核心概念 定義&#xff1a;網絡協議是計算機通信的“語言規則”&#xff0c;規定了數據格式、傳輸時序、控制信號等&#xff0c;確保不同系統實體間正常通信。作用&#xff1a;實現資源共享與信息交換的基礎。常見類型&#xff1a; 局域網協議&#xff08;LAN&…

《數據之心》

《數據之心》一、故障2045年&#xff0c;中國“天算”量子云中樞第七區。魚小妖站在控制臺前&#xff0c;指尖劃過全息屏&#xff0c;藍光映在她清秀的臉龐上。她的長發如墨&#xff0c;眸子卻似星河&#xff0c;倒映著無數跳動的數據流。她是第七區最年輕的系統神經工程師&…

《C++ Primer 第五版》不要返回局部對象的引用或指針

1. 先看一個“看似合理”的例子#include <iostream> using namespace std;int& foo() {int x 10; // 局部變量&#xff0c;存在于棧中return x; // 返回它的引用 }int main() {int& ref foo(); // ref 綁定到了已經被銷毀的 xcout << ref &…

2024鴻蒙樣題需要掌握的知識點

一、讀取json格式文件為對象或數組&#xff0c;顯示相應字段1、創建json文件的參數一致的類2、導入類、導入json文件3、循環渲染import router from ohos.router //導入即對象 import books from resources/rawfile/book1.json import { Book } from ../model/BookEntry Compon…

QML Charts組件之坐標軸示例

目錄引言&#x1f3af; 運行效果預覽&#x1f4da; 相關系列文章五種坐標軸詳解與代碼實踐1. 數值坐標軸&#xff08;ValueAxis&#xff09;示例代碼說明2. 對數坐標軸&#xff08;LogValueAxis&#xff09;示例代碼說明3. 日期坐標軸&#xff08;DateTimeAxis&#xff09;示例…

Vue3+ElementPlus倒計時示例

按鈕文字默認顯示“開始倒計時”當點擊按鈕時&#xff0c;顯示正在倒計時(倒計時數字)倒計時結束按鈕顯示“開始倒計時” 倒計時邏輯 Hooks 函數 hooks/useCountDown.js /*** hooks函數&#xff1a;函數是用于封裝和復用組件邏輯的一種機制* 定義&#xff1a;Hooks 是一種在不使…

docker 的網絡

1.查看docker里面的網絡docker network ls 2.查看某個 Docker 網絡的 網關 IP 和 子網段docker network inspect <網絡名或ID>

數據挖掘,到底是在挖掘什么?

&#x1f468;?&#x1f393;博主簡介 &#x1f3c5;CSDN博客專家 ??&#x1f3c5;云計算領域優質創作者 ??&#x1f3c5;華為云開發者社區專家博主 ??&#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社區&#xff1a;運維交流社區 歡迎大家的加入&#xff01…

【車載開發系列】CS+ for CC開發環境IDE

【車載開發系列】CS for CC開發環境IDE 【車載開發系列】CS for CC開發環境IDE【車載開發系列】CS for CC開發環境IDE一. 引言二. IDE安裝三. 新建工程四. 堆與棧內存的設置1&#xff09;棧內存設置2&#xff09;堆內存設置一. 引言 瑞薩單片機開發環境有三種&#xff1a;estu…

如何將視頻從安卓設備傳輸到Mac?

你是否想要創建備份、釋放存儲空間&#xff0c;或者分享難忘時刻&#xff1f;你可能想要輕松地將視頻從安卓設備復制到MacBook。在本篇關于“如何將視頻從安卓傳輸到Mac”的指南中&#xff0c;我們將介紹五種智能方法&#xff0c;幫助你無縫地復制視頻。從傳統的WiFi連接方法到…

MyBatis 初識:框架定位與核心原理——SQL 自由掌控的藝術

&#x1f50d; MyBatis 初識&#xff1a;框架定位與核心原理——SQL 自由掌控的藝術 文章目錄&#x1f50d; MyBatis 初識&#xff1a;框架定位與核心原理——SQL 自由掌控的藝術&#x1f9e9; 一、為什么需要 ORM 框架&#xff1f;&#x1f4a1; JDBC 的痛點&#xff1a;原始時…

谷粒商城項目-P6環境-使用vagrant快速創建Linux虛擬機

1.虛擬機 虛擬機使用virtualbox,我使用的是6.0.12版本 2.創建linux系統 使用vagrant 驗證是否安裝完成vagrant 在cmd使用vagrant看看有沒有命令提示 創建虛擬機 在cmd使用vagrant init centos/7創建 創建完成后使用vagrant up啟動虛擬容器 啟動完成后&#xff0c;使用va…

人形機器人的“奧運會“:宇樹科技領跑,動捕技術成訓練關鍵

近年來&#xff0c;人工智能、仿生學和運動控制技術的突破性發展&#xff0c;正推動人形機器人成為全球科技競爭的新焦點。各國政府、科研機構和企業加速布局醫療、救援、服務等領域的應用場景。在此背景下&#xff0c;首屆世界人形機器人大會應運而生并于近日圓滿落幕。此次運…