MIPS汇编入门

MIPS汇编入门

  • 寄存器种类
  • 指令种类
  • 寻址方式
    • 立即数寻址
    • 寄存器寻址
    • 基址寻址
    • 相对寻址
    • 伪直接寻址
  • 指令总览

寄存器种类

  • MIPS共有32个通用寄存器
  • 在汇编中,寄存器标志由$符号开头
  • 寄存器表示共有两种方法
    • 直接使用该寄存器对应编号,例如:$0,$31
    • 使用对应的寄存器名称,例如:$t1, $sp(名称见下列表格)
寄存器编号寄存器名寄存器用途
0zero永远返回0
1$at汇编保留寄存器
2-3$v0 - $v1存储表达式或者函数的返回值
4-7$a0 - $a3存储子程序的前4个参数,在子程序调用过程中释放
8-15$t0 - $t7临时变量,同上调用时不保存
16-23$s0 - $s7调用时保存
24-25$t8 - $t9临时变量,同上调用时不保存
26-27$k0 - $k1中断函数返回值,不可做其他用途
28$gp(Global Pointer)保存静态或外部变量
29$sp栈指针,指向栈顶
30$ s8 ($ fp)帧指针
31$ra返回地址

指令种类

  • R型指令
000000RsRtRdshamtfunct
6bits5bits5bits5bits5bits6bits
  • I型指令
OPRsRt立即数
6bits5bits5bits16bits
  • J型指令
OP立即数
6bits26bits

寻址方式

立即数寻址

  • I型指令
    addi s1,s2, 10 相当于 $s1 = $s2 + E(10)
OPRsRt立即数
6bits$s2$s116bits

寄存器寻址

  • R型指令
    add $t0, $s1, $s2 相当于 $t0 = $s1 + $s2
000000RsRtRdshamtfunct
6bits$s1$s2$t0000006bits

基址寻址

  • I型指令
    Rs 中存放基址寄存器,因为立即数只有16位,所以我们将其带符号拓展为32位,然后与基址相加,就可以得到目标数的地址。
  • 常见的基址寻址指令:lw, sw, lh, sh, lb, lbu等

相对寻址

  • I型指令
    将16位的立即数带符号拓展为32位后,将其左移两位(此时它的最低两位就是0),然后与PC寄存器地址相加,所得为目标值的地址
  • 常见相对寻址指令有:beq,bne

伪直接寻址

  • J型指令
    对于26位的立即数直接左移两位,此时它为28位,而且它的最低两位为0,这时我们取PC的高四位地址做为目标地址的高四位,其余28位为得到的立即数,这个地址为目标值的地址。

指令总览

类别指令含义备注
算数add $s1,$s2,$s3$s1 = $s2 + $s3三个操作数;检测溢出
算数sub $s1,$s2,$s3$s1 = $s2 - $s3三个操作数;检测溢出
算数加立即数addi $s1,$s2,100$s1 = $s2 + 100加常数;检测溢出
算数无符号加addu $s1,$s2,$s3$s1 = $s2 + $s3三个操作数;不检测溢出
算数无符号减subu $s1,$s2,$s3$s1 = $s2 - $s3三个操作数;不检测溢出
算数无符号加立即数addiu $s1,$s2,100$s1 = $s2 + 100加常数;不检测溢出
算数从协处理器寄存器中获得mfc0 $s1,$epc$s1 = $epc复制异常PC到专用处理器
算数mult $s2,$s3Hi,Lo = $s2 × $s364位有符号积存在Hi,Lo中
算数无符号乘multu $s2,$s3Hi,Lo = $s2 × $s364位无符号积存在Hi,Lo中
算数div $s2,$s3Lo = $s2 / $s3;Hi = $s2 mod $s3Lo = 商;Hi = 余数
算数无符号除div $s2,$s3Lo = $s2 / $s3;Hi = $s2 mod $s3无符号商和余数
算数从Hi中获得mfhi $s1$s1 = Hi用来获得Hi的副本
算数从Lo中获得mflo $s1$s1 = Lo用来获得Lo的副本
数据传输取字lw $s1,20($s2)$s1 = Memory[$s2 + 20]将一个字从内存中取到寄存器中
数据传输存字sw $s1,20($s2)Memory[$s2 + 20] = $s1将一个字从寄存器中取到内存中
数据传输取无符号半字lhu $s1,20($s2)$s1 = Memory[$s2 + 20]将半字从内存中取到寄存器中
数据传输存半字sh $s1,20($s2)Memory[$s2 + 20] = $s1将半字从寄存器中取到内存中
数据传输取无符号字节lbu $s1,20($s2)$s1 = Memory[$s2 + 20]将一个字节从内存中取到寄存器中
数据传输存字节sb $s1,20($s2)Memory[$s2 + 20] = $s1将一个字节从寄存器中取到内存中
数据传输取链接字ll $s1,20($s2)$s1 = Memory[$s2 + 20]取字作为原子交换的前半部
数据传输存条件字sc $s1,20($s2)Memory[$s2 + 20] = $s1或$s1 = 0/1存字作为原子交换的后半部
数据传输立即数读入高16位lui $s1,100$s1 = 100 ×2^16取立即数并放在高16位
逻辑运算AND $s1,$s2,$s3$s1 = $s2 & $s3三个寄存器操作数按位与
逻辑运算OR $s1,$s2,$s3$s1 = $s2 | $s3三个寄存器操作数按位或
逻辑运算或非NOR $s1,$s2,$s3$s1 = ~($s2 | $s3)三个寄存器操作数按位或非
逻辑运算与立即数ANDi $s1,$s2,100$s1 = $s2 & 100和常数按位与
逻辑运算或立即数ORi $s1,$s2,100$s1 = $s2 | 100和常数按位或
逻辑运算逻辑左移sll $s1,$s2,10$s1 = $s2 << 10根据常数左移相应位
逻辑运算逻辑右移srl $s1,$s2,10$s1 = $s2 >> 10根据常数右移相应位
条件跳转相等时跳转beq $s1,$s2,25if($s1 == $s2)跳至PC + 4 + 100相等检测;和PC相关的跳转
条件跳转不相等时跳转bne $s1,$s2,25if($s1 != $s2)跳至PC + 4 + 100不相等检测;和PC相关的跳转
条件跳转小于时置位slt $s1,$s2,$3if($s2 < $s3) $s1 = 1;否则等于0比较是否小于;补码形式
条件跳转小于立即数时置位slti $s1,$s2,100if($s2 < 100) $s1 = 1;否则等于0比较是否小于常数
条件跳转无符号数比较小于时置位sltu $s1,$s2,$3if($s2 < $s3) $s1 = 1;否则等于0比较是否小于
条件跳转无符号数比较小于立即数时置位sltiu $s1,$s2,100if($s2 < 100) $s1 = 1;否则等于0比较是否小于常数
无条件跳转跳转j 2500跳至10000跳转到目标地址
无条件跳转跳转至寄存器所指地址jr $ra跳至$ra用于switch语句,以及过程调用的返回
无条件跳转跳转并链接jal 2500$ra = PC + 4; 跳至10000用于过程调用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理心得--如何成为优秀的架构师

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

LMDeploy 大模型量化部署

Weight Only量化是一种常见的模型优化技术&#xff0c;特别是在深度学习模型的部署中。这种技术仅对模型的权重进行量化&#xff0c;而不涉及激活&#xff08;即模型中间层的输出&#xff09;。选择采用Weight Only量化的原因主要包括以下几点&#xff1a; 减少模型大小 通过将…

VirtualBox虚拟机安装 Linux 系统

要想学习各种计算机技术&#xff0c;自然离不开Linux系统。并且目前大多数生产系统都是安装在Linux系统上。常用的Linux系统有 Redhat&#xff0c;Centos&#xff0c;OracleLinux 三种。 三者的区别简单说明如下&#xff1a; Red Hat Enterprise Linux (RHEL): RHEL 是由美国…

ICASSP2024 | MLCA-AVSR: 基于多层交叉注意力机制的视听语音识别

视听语音识别&#xff08;Audio-visual speech recognition, AVSR&#xff09;是指结合音频和视频信息对语音进行识别的技术。当前&#xff0c;语音识别&#xff08;ASR&#xff09;系统在准确性在某些场景下已经达到与人类相媲美的水平。然而在复杂声学环境或远场拾音场景&…

Qt应用软件【文件篇】XML文件增删查改

文章目录 1. XML文件简介2. XML文件的主要特点3. XML文件的应用场景4. Qt XML文件相关API汇总5. Qt读取XML文件代码示例6. Qt写入XML文件代码示例7. Qt修改XML文件代码示例8. 字符串转换为XML对象9. XML对象转换为字符串10.替换复杂的xml文件中属性,保持格式不变1. XML文件简介…

大语言模型推理加速技术:计算加速篇

原文&#xff1a;大语言模型推理加速技术&#xff1a;计算加速篇 - 知乎 目录 简介 Transformer和Attention 瓶颈 优化目标 计算加速 计算侧优化 KVCache Kernel优化和算子融合 分布式推理 内存IO优化 Flash Attention Flash Decoding Continuous Batching Page…

Go Run - Go 语言中的简洁指令

原文&#xff1a;breadchris - 2024.02.21 也许听起来有些傻&#xff0c;但go run是我最喜欢的 Go 语言特性。想要运行你的代码&#xff1f;只需go run main.go。它是如此简单&#xff0c;我可以告诉母亲这个命令&#xff0c;她会立即理解。就像 Go 语言的大部分功能一样&…

微调实操四:直接偏好优化方法-DPO

在《微调实操三:人类反馈对语言模型进行强化学习(RLHF)》中提到过第三阶段有2个方法,一种是是RLHF, 另外一种就是今天的DPO方法, DPO通过直接优化语言模型来实现对其行为的精确控制&#xff0c;而无需使用复杂的强化学习&#xff0c;也可以有效学习到人类偏好&#xff0c;DPO相…

python中的类与对象(2)

目录 一. 类的基本语法 二. 类属性的应用场景 三. 类与类之间的依赖关系 &#xff08;1&#xff09;依赖关系 &#xff08;2&#xff09;关联关系 &#xff08;3&#xff09;组合关系 四. 类的继承 一. 类的基本语法 先看一段最简单的代码&#xff1a; class Dog():d_…

java常见面试题1

面试题 简单但容易错的题 1.自增、自减 简单题目 // 部分代码&#xff0c;非可运行 int i 1; i i; int j i; int k i i * i; //i? j? k? 这个题看着简单又凌乱的&#xff0c;重要的考点主要是以下几点&#xff1a; “” 右边是从左到右将加载值依次压入操作数栈&…

智慧公厕的目的和意义是什么?

智慧公厕是近年来城市建设中的一项重要举措&#xff0c;其目的在于实现公共厕所的智慧化管理&#xff0c;为市民群众提供更好的服务体验&#xff0c;助力智慧城市和数字环卫的发展&#xff0c;提升社会公共卫生服务水平。 与此同时&#xff0c;智能公厕也具有重要的意义&#x…

C 语言简介

C 语言是一种通用的高级语言&#xff0c;最初是由丹尼斯里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。 在 1978 年&#xff0c;布莱恩柯林汉&#xff08;Brian Kernighan&#xff09;和丹尼斯里奇&#xff08;D…

springboot+vue实现微信公众号扫码登录

通常在个人网站中&#xff0c;都会有各种第三方登录&#xff0c;其中微信登录需要认证才能使用&#xff0c;导致个人开发者不能进行使用此功能&#xff0c;但是我们可以使用微信公众号回复特定验证码来进行登录操作。 微信关键词处理 微信公众号关键词自动回复&#xff0c;具体…

60kW 可编程直流回馈负载箱的优势和特点

60kW可编程直流回馈负载箱是一种先进的电力设备&#xff0c;主要用于模拟电网中的负载&#xff0c;为电力系统提供稳定的负载环境。它具有许多优势和特点&#xff0c;使其在电力系统中得到了广泛的应用。 60kW可编程直流回馈负载箱具有高效的能源转换效率&#xff0c;能够将电能…

Object.groupBy分组方法

在某些浏览器的某些版本中&#xff0c;此方法被实现为 Array.prototype.group() 方法。由于 web 兼容性问题&#xff0c;它现在以静态方法实现。 函数功能 提供的回调函数返回的字符串值对给定可迭代对象中的元素进行分组。返回的对象具有每个组的单独属性&#xff0c;其中包…

代码随想录算法训练营第四十四天|518. 零钱兑换 II、377. 组合总和 Ⅳ

518. 零钱兑换 II 题目链接&#xff1a;零钱兑换 II 题目描述&#xff1a; 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设…

LQB新2024 DS18B20温度检测

温度检测 #include "stc15.h" #include <intrins.h> #include <stdio.h> #include <absacc.h> typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32;float dsread();void WriteNbyte(u8 addr…

人机界面和三菱PLC之间以太网通信

本文主要描述人机界面WinCC如何与三菱Q系列PLC进行以太网通讯&#xff0c;主要介绍了CPU自带以太网口和扩展以太网模块两种情况以及分别使用TCP、UDP两种协议进行通讯组态步骤及其注意事项。 一、 说明 WinCC从V7.0 SP2版本开始增加了三菱以太网驱动程序&#xff0c;支持和三…

Windows常用协议

LLMNR 1. LLMNR 简介 链路本地多播名称解析(LLMNR)是一个基于域名系统(DNS)数据包格式的协议,可用于解析局域网中本地链路上的主机名称。它可以很好地支持IPv4和IPv6&#xff0c;是仅次于DNS 解析的名称解析协议。 2.LLMNR 解析过程 当本地hosts 和 DNS解析 当本地hosts 和 …

docker 常用指令(启动,关闭,查看运行状态)

文章目录 docker 常用指令启动 docker关闭 docker查看 docker的运行状态 docker 常用指令 启动 docker systemctl start docker关闭 docker systemctl stop docker查看 docker的运行状态 systemctl status docker如下图所示&#xff1a; 表示docker正在运行中