MIPS汇编语言详解

MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简指令集计算机(RISC)架构,由MIPS计算机系统(现在是MIPS Technologies)开发。它以其简单性和效率而闻名,特别适用于嵌入式系统、网络设备和其他专业应用。

在MIPS汇编语言中,.data.text 是两种伪指令,用于指示汇编器如何处理代码的不同部分。

  1. .data

    • .data 伪指令用于声明数据段(data segment),即用于存储程序中静态数据的部分。
    • .data 部分,程序员可以定义各种数据,如变量、数组、字符串等。
    • 数据定义通常使用 .word.byte 等指令,以指定数据的类型和初始值。
    • 在程序执行时,.data 部分的数据会被加载到内存中的数据段,供程序使用。
  2. .text

    • .text 伪指令用于声明代码段(text segment),即存储程序执行指令的部分。
    • .text 部分,程序员编写程序的指令序列,定义程序的逻辑和功能。
    • 代码段通常包括各种指令,如算术运算、逻辑运算、条件分支、函数调用等。
    • 在程序执行时,CPU会从代码段中逐条读取指令,并执行相应的

一、常见指令

当谈及MIPS指令集架构时,可以将指令分为三种主要类型:R型指令(Register)、I型指令(Immediate)、J型指令(Jump)。每种类型的指令都有不同的功能和用途。下面简要介绍一下每种类型的指令及其常见的指令:

1.R型指令(寄存器型指令)

这种指令类型主要用于在寄存器之间执行算术运算、逻辑运算和数据移动操作。

类型
  • add:将两个寄存器中的值相加并将结果存储在目标寄存器中。
  • sub:将一个寄存器中的值减去另一个寄存器中的值,并将结果存储在目标寄存器中。
  • and:对两个寄存器中的值执行按位与操作,并将结果存储在目标寄存器中。
  • or:对两个寄存器中的值执行按位或操作,并将结果存储在目标寄存器中。
  • slt:如果一个寄存器中的值小于另一个寄存器中的值,则将1存储在目标寄存器中;否则,将0存储在目标寄存器中。
格式
  • opcode:操作码,对于R型指令,这个字段总是0。
  • rs:第一个源寄存器。
  • rt:第二个源寄存器。
  • rd:目标寄存器。
  • shamt:移位量,对于算术和逻辑运算,这个字段通常是0。
  • funct:功能码,决定具体的操作。
  • R型指令的格式如下:

add 指令将两个寄存器中的值相加,并将结果存储在目标寄存器中,将寄存器$t1和$t2中的值相加,并将结果存储在寄存器$t0中。add rd, rs, rt

  • 例子:add $t0, $t1, $t2
  • 二进制表示(假设$t0=$8,$t1=$9,$t2=$10):
2. I型指令(立即数型指令)

这种指令类型主要用于执行带有立即数(常数)的操作,例如加载和存储数据、条件分支等典型的I型指令包括:

类型
  • lw:从内存中加载一个字(32位)数据到寄存器中。
  • sw:将寄存器中的字(32位)数据存储到内存中。
  • beq:如果两个寄存器中的值相等,则跳转到指定的目标地址。
  • bne:如果两个寄存器中的值不相等,则跳转到指定的目标地址。
  • addi:将一个寄存器中的值与一个立即数相加,并将结果存储在目标寄存器中。
格式

  • opcode:操作码,决定指令的类型。
  • rs:源寄存器。
  • rt:目标寄存器。
  • immediate:立即数,用于算术运算或地址偏移。
  • addi 指令:将寄存器rs中的值与立即数相加,并将结果存储在目标寄存器rt中。格式:addi rt, rs, immediate

二进制表示addi $t0, $t1, 10(假设$t0=$8,$t1=$9):

​​​​​​​3. J型指令(跳转型指令)

这种指令类型主要用于实现无条件跳转和跳转到子程序的操作。

类型
  • j:无条件跳转到指定的目标地址。
  • jal:跳转并将当前指令的地址存储在$ra寄存器中,通常用于函数调用。
格式
  • 示例:j 指令

  • 功能:无条件跳转到指定的目标地址。
  • 格式:j address
  • 例子:j 0x00400020
  • 解释:跳转到地址0x00400020处继续执行指令。
4. Function的定义与使用
  1. 函数定义:在MIPS汇编语言中,函数的定义通常包括两部分:函数的标签和函数的代码体。函数标签用于标识函数的入口点,而函数的代码体则包含了实现函数功能的具体指令序列。
    func_name:
        # 函数代码体
        # ...
    
  2. 函数调用:要调用函数,可以使用jal(Jump and Link)指令来实现。jal指令会跳转到指定函数的入口点,并将下一条指令的地址(即函数返回地址)存储在寄存器$ra中。在函数返回时,可以使用jr(Jump Register)指令来返回到函数调用点。
    jal func_name  # 调用函数func_name
    # 函数返回后的代码
    
  3. 参数传递:函数可以接收参数,参数通常通过寄存器传递。在调用函数前,需要将参数值存储在指定的参数寄存器中。在函数内部,可以通过读取这些寄存器来获取参数值。
    # 调用函数时,将参数存储在参数寄存器中
    li $a0, 10     # 将参数值10存储在$a0寄存器中
    jal func_name  # 调用函数func_name
    
  4. 返回值传递:函数可以返回值,返回值通常通过寄存器传递。在函数结束时,需要将返回值存储在指定的返回值寄存器中,通常是$v0和$v1寄存器。
    func_name:
        # 函数代码体
        # 将返回值存储在$v0寄存器中
        li $v0, 42    # 将返回值设置为42
        jr $ra        # 返回到函数调用点
    
  5. 保存和恢复现场:在调用函数时,为了避免函数修改调用者的寄存器值,通常需要保存和恢复现场。可以使用栈(stack)来保存和恢复寄存器的值。
    func_name:
        # 保存现场
        addi $sp, $sp, -4  # 栈指针减4
        sw $ra, 0($sp)     # 将返回地址存储在栈中
    
        # 函数代码体
        # ...
    
        # 恢复现场
        lw $ra, 0($sp)     # 将返回地址从栈中加载到$ra寄存器
        addi $sp, $sp, 4   # 栈指针加4
        jr $ra             # 返回到函数调用点
    

二、MIPS与机器语言的相互转换

MIPS指令是通过将指令的操作码(opcode)和操作数字段编码成二进制形式来转换成对应的机器码。具体的转换过程取决于指令的类型(R型、I型、J型等)以及指令的具体格式。

  1. R型指令转换

    • R型指令的机器码通常由以下字段组成:操作码(opcode)、源寄存器(rs)、目标寄存器(rt)、操作数(rd)、移位量(shamt)和功能码(funct)。
    • 操作码(opcode)通常是6位,用于指示指令类型。
    • 源寄存器(rs)、目标寄存器(rt)、操作数(rd)和移位量(shamt)通常是5位,用于指示操作数寄存器的编号或立即数。
    • 功能码(funct)通常是6位,用于指示具体的操作,如加法、按位与等。
    • 按照MIPS指令集规范,每个指令的各个字段的位数和含义是固定的,因此根据指令的具体类型和操作,可以将这些字段按照指定的位数编码成对应的机器码。
  2. I型指令转换

    • I型指令的机器码通常由以下字段组成:操作码(opcode)、源寄存器(rs)、目标寄存器(rt)和立即数(immediate)。
    • 立即数(immediate)通常是16位,用于指示立即数操作的具体值。
    • 其他字段的位数和含义与R型指令类似。
    • 在转换过程中,操作码、寄存器编号和立即数按照指定的位数进行编码。
  3. J型指令转换

    • J型指令的机器码通常由以下字段组成:操作码(opcode)和目标地址(target address)。
    • 目标地址(target address)通常是26位,用于指示跳转目标的地址。
    • 操作码的位数和含义与其他指令类型类似。
    • 在转换过程中,操作码和目标地址按照指定的位数进行编码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648293.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】排序算法大全(快速、堆、归并、插入、折半、希尔、冒泡、计数、基数)各算法比较、解析+完整代码

文章目录 八、排序1.插入排序1.1 直接插入排序1.2 折半插入排序1.3 希尔排序 2.交换排序2.1 冒泡排序2.2 快速排序 3.选择排序3.1 简单选择排序3.2 堆3.2.1 堆排序3.2.2 堆插入删除*完善代码 堆 4.归并、基数、计数排序4.1 归并排序4.2 基数排序4.3 计数排序 5.内部排序算法的比…

PCL 二维凸包切片法计算树冠体积

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 二维凸包法是先将树冠等间隔分层切片,如图(e)采用二维凸包算法对每层…

中国改革报是什么级别的报刊?在哪些领域具有较高的影响力?

中国改革报是什么级别的报刊?在哪些领域具有较高的影响力? 《中国改革报》是国家发展和改革委员会主管的全国性综合类报纸。它在经济领域和改革发展方面具有重要的影响力,是传递国家政策、反映改革动态的重要平台。该报对于推动中国的经济改…

实验室课程|基于SprinBoot+vue的实验室课程管理系统(源码+数据库+文档)

实验室课程管理系统 目录 基于SprinBootvue的实验室课程管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介…

PyTorch深度学习实战(44)——基于 DETR 的目标检测模型

PyTorch深度学习实战(44)——基于 DETR 的目标检测模型 0. 前言1. Transformer1.1 Transformer 基础1.2 Transformer 架构 2. DETR2.1 DETR 架构2.2 实现 DETR 模型 3. 基于 DETR 实现目标检测3.1 数据加载与模型构建3.2 模型训练与测试 小结系列链接 0.…

WindowsCMD窗口配置OhMyPosh

WindowsCMD窗口配置OhMyPosh 文章目录 WindowsCMD窗口配置OhMyPosh1. 按装Clink1. 安装Oh-My-Posh2. 安装Clink2. 安装后的位置 2. 编写Lua脚本1. oh-my-posh Lua脚本2. 重启cmd窗口看效果 OhMyPosh对Windows CMD 没有现成的支持。 然而可以使用Clink来做到这一点,它…

深度学习——自己的训练集——训练模型(CNN)

训练模型 1.导入必要的库2.加载类别名称3.创建标签映射字典4.加载图像数据和对应的标签5.构建和编译CNN模型6.训练模型7.保存训练好的模型 1.导入必要的库 导入处理数据和训练模型时需要的库 os: 这个模块提供了与操作系统交互的功能,比如文件和目录操作。 cv2: 这…

2024-5-10-从0到1手写配置中心Config之Spring Value热更新

定义SpringValueProcessor处理类 实现BeanPostProcessor后置处理器接口,扫描所有的Spring value,保存起来。实现ApplicationListener接口,在配置变更时,更新所有的spring value 实现BeanPostProcessor后置处理器接口 实现postPr…

移动云:连接未来的智慧之旅

随着数字化转型的加速,云服务在各行各业中的应用越来越广泛。移动云不仅提供了灵活的计算和存储资源,还通过创新的技术手段,为企业和开发者解决了许多实际问题。在这个变革的大背景下,移动云服务作为中国移动倾力打造的云业务品牌…

155. 最小栈

题目: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶…

深入解析内置模块OS:让你的Python代码更懂操作系统

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、OS模块简介与基础应用 二、文件与目录操作详解 三、OS模块的高级应用:双色…

【算法】前缀和——除自身以外数组的乘积

本节博客是用前缀和算法求解“除自身以外数组的乘积”,有需要借鉴即可。 目录 1.题目2.前缀和算法3.变量求解4.总结 1.题目 题目链接:LINK 2.前缀和算法 1.创建两个数组 第一个数组第i位置表示原数组[0,i-1]之积第二个数组第i位置表示原数组[i1,n-1]…

How to limit request by IP on nginx?

/etc/nginx/conf.d/default.conf 1.Define a limit_req_zone # 定義限流區塊 limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; 是一个 Nginx 配置指令,用于定义请求限制区域和…

【linux】多线程(2)

文章目录 线程的应用生产消费者模型自制锁生产消费队列成员参数生产函数消费函数 任务处理方式主函数 POSIX信号量sem_wait()sem_post() 线程池应用场景示例 单例模式饿汉实现单例 吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭.懒汉实现单例…

GMSL2硬件设计V1.1

一、说明 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司(现属于ADI)推出的一种高速串行接口,通过同轴电缆或屏蔽双绞线(STP)传输高速串行数据,用于汽车摄像头和显示器应用。GMSL2就是指ADI专有的第二代千兆多媒体串行链路技术,传输…

重生之while在鸣潮学习HTML

个人主页:终端 今天是开荒的第五天,数据坞都刷了吗,没刷就过来学html! 目录 JavaWeb学习路线 1.HTML入门 1.1什么是HTML 1.2HTML&CSS&JavaScript的作用 1.3什么是超文本 1.4什么是标记语言 1.5HTML基础结构 1.6HTML的…

通过acme.sh和cloudflare实现免费ssl证书自动签发

参考使用acme.sh通过cloudflare自动签发免费ssl证书 | LogDicthttps://www.logdict.com/archives/acme.shshi-yong-cloudflarezi-dong-qian-fa-mian-fei-sslzheng-shu

Jmeter-使用手册(_5.5版本)

JMeter是一个Java桌面应用程序,具有使用Swing图形API的图形界面。可以进行接口、性能等测试,也可以对任何数据库进行同样的测试,具有可移植性,可跨平台支持Windows,Linux,Mac上使用。 JMeter运行场景不仅可…

【openlayers系统学习】4.2Mapbox 样式渲染图层

二、Mapbox 样式渲染图层 显然我们目前的地图需要一些样式。 VectorTile​ 图层的样式与 Vector​ 图层的样式工作方式完全相同。那里描述的样式在这里也适用。 对于这样的地图,创建数据驱动的样式(对矢量图层操作)非常简单。但矢量切片也用…

AIGC 003-Controlnet升级你的SD让图像生成更加可控!

AIGC 003-Controlnet升级你的SD让图像生成更加可控! 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 ControlNet 论文 (Adding Conditional Control to Text-to-Image Diffusion Models) 提出了一种名为 ControlNet 的神经网络结构,旨在为大型文本到图…