一、前言: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;首届世界人形机器人大会应运而生并于近日圆满落幕。此次运…