MIPS汇编

1.概述简析

1.基于RISC的架构

RISC(Reduced Instruction Set Computer)架构是一种计算机处理器架构,其设计核心思想是简化指令集合,使得处理器能够更快地执行指令。RISC架构的设计理念主要包括以下几个方面:

  1. 精简指令集合:RISC架构尽量减少指令集合的大小,使得每个指令的执行时间都较短,从而提高了整体的指令执行速度。相比之下,复杂指令集合(CISC)架构包含更多复杂的指令,这些指令可能会占用更多的芯片空间,导致每个指令的执行时间较长
  2. 固定长度指令:RISC架构通常采用固定长度的指令格式,这样可以简化指令的解码和执行过程,提高了处理器的执行效率。相比之下,CISC架构中的指令长度可能会不同,需要更复杂的解码逻辑
  3. 使用寄存器:RISC架构通常会提供更多的寄存器,用于存储中间结果和临时数据,减少了访存操作的次数,从而提高了程序的执行效率
  4. 流水线技术:RISC架构通常会采用流水线技术,将指令执行过程划分为多个阶段,并同时执行多条指令,从而提高了处理器的吞吐量和性能
  5. 延迟槽:为了充分利用流水线技术,RISC架构中通常会采用延迟槽(Delay Slot)的设计,使得指令的执行顺序更加灵活,可以提高指令级并行度

2.相关结构的简析

  1. 指令集(Instruction Set)
    • MIPS指令集包括多种指令类型,如R型、I型和J型指令
    • 每条指令由操作码(opcode)、寄存器标识符和立即数等字段组成
    • MIPS指令集支持基本的算术运算、逻辑运算、数据传输、控制转移等操作
  2. 寄存器文件(Register File)
    • MIPS架构提供了32个通用寄存器(0 – 31),用于存储数据和中间计算结果
    • 这些寄存器具有固定的功能,如zero用于存储常数0,ra用于存储返回地址等
  3. 数据存储器(Data Memory)
    • MIPS架构中的数据存储器用于存储程序的数据,包括变量、数组等
    • 数据存储器通常是一个字节寻址的内存,可以存储各种数据类型
  4. 程序计数器(Program Counter,PC)
    • 程序计数器是一个特殊的寄存器,用于存储当前执行的指令的地址
    • 在每条指令执行完毕后,PC会自动递增以指向下一条指令的地址,实现指令的顺序执行
  5. 指令存储器(Instruction Memory)
    • 指令存储器用于存储程序的指令序列,包括各种操作和控制指令
    • MIPS程序从指令存储器中读取指令,并通过解码执行这些指令
  6. 控制单元(Control Unit)
    • 控制单元负责解析指令、控制数据通路和执行指令操作
    • 它根据指令的操作码和操作数控制数据的传输和运算过程,以实现指令的功能

2.寄存器的种类

MIPS共有32个通用寄存器

寄存器标志由$符号开头

$zero($0):恒为0的寄存器。任何尝试向其写入的操作都会被忽略
$v0、$v1($2、$3):用于存放函数返回值的寄存器
$a0 - $a3($4 - $7):函数参数传递寄存器,用于传递函数参数给函数
$t0 - $t9($8 - $15、$24 - $25):临时寄存器,用于存储临时数据
$s0 - $s7($16 - $23):用于存储函数调用过程中需要保持不变的寄存器,也可用于存储局部变量
$k0、$k1($26、$27):内核寄存器,用于异常处理
$gp($28):全局指针,通常用于存储全局数据区的地址
$sp($29):栈指针,用于指向当前栈顶
$fp($30):帧指针,用于指向当前函数的栈帧
$ra($31):返回地址寄存器,存储函数返回时需要返回的地址

3.指令种类

1.R型指令

R型指令主要用于寄存器之间的操作,如算术运算、逻辑运算和移位操作

000000RsRtRdshamtfunct
6bits5bits5bits5bits5bits6bits

2.I型指令

I型指令主要用于寄存器和立即数之间的操作,如加载数据到寄存器、存储寄存器中的数据到内存

OPRsRt立即数
6bits5bits5bits16bits

3.J型指令

J型指令主要用于实现跳转操作,即改变程序计数器(PC)的值以实现非顺序执行的功能

OP立即数
6bits26bits

4.寻址方式

1.立即数寻址(I型指令)

1.即数寻址的概述:

立即数寻址是一种指令寻址方式,其中指令中包含了要操作的数据的常量或立即数

这种寻址方式常见于RISC架构中,其中指令的操作数之一是一个立即数,而不是一个内存地址或寄存器中的值

在立即数寻址中,指令中的立即数表示一个常量值,而不是一个地址或存储在内存中的数据。当处理器执行这样的指令时,它会直接使用指令中的立即数进行计算或操作,而不需要额外的内存访问

2.寻址的优点包括:

  1. 节省内存访问时间:由于立即数直接包含在指令中,因此不需要额外的内存访问来获取操作数,可以减少指令的执行时间
  2. 简化指令设计:立即数寻址使得指令格式更加简单,不需要指定内存地址或寄存器编号,简化了指令的解码和执行过程

3.寻址的限制和缺点:

  1. 立即数大小限制:由于立即数直接包含在指令中,因此其大小通常受到指令格式的限制,可能无法表示较大的常量值
  2. 限制了灵活性:立即数寻址只能用于常量值,不能动态地从内存中读取数据,因此在某些情况下可能会限制指令的灵活性和功能

2.寄存器寻址(R型地址)

000000RsRtRdshamtfunct
6bits$s1$s2$t0000006bits

3.基址寻址(I型语言)

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

4.相对寻址(I型指令)

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

5.伪直接寻址(J型指令)

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

5.指令总览

类别指令含义备注
算数add s1,s2,$s3s1 = s2 + $s3三个操作数;检测溢出
算数sub s1,s2,$s3s1 = s2 – $s3三个操作数;检测溢出
算数加立即数addi s1,s2,100s1 = s2 + 100加常数;检测溢出
算数无符号加addu s1,s2,$s3s1 = s2 + $s3三个操作数;不检测溢出
算数无符号减subu s1,s2,$s3s1 = s2 – $s3三个操作数;不检测溢出
算数无符号加立即数addiu s1,s2,100s1 = s2 + 100加常数;不检测溢出
算数从协处理器寄存器中获得mfc0 s1,epcs1 = 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,$s3s1 = s2 & $s3三个寄存器操作数按位与
逻辑运算OR s1,s2,s3 | s1 = s2 | s3三个寄存器操作数按位或
逻辑运算或非NOR s1,s2,s3 | s1 = ~(s2 | s3)三个寄存器操作数按位或非
逻辑运算与立即数ANDi s1,s2,100s1 = s2 & 100和常数按位与
逻辑运算或立即数ORi s1,s2,100s1 = s2 | 100和常数按位或
逻辑运算逻辑左移sll s1,s2,10s1 = s2 << 10根据常数左移相应位
逻辑运算逻辑右移srl s1,s2,10s1 = 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用于过程调用

6.程序结构

  • 数据声明+普通文本+程序编码
  • 文件后缀为.s或.asm
  • 数据声明在代码段之后

7.数据声明

  • 数据段以.data为开始标志
  • 声明变量后,即在主存中分配空间

8.代码结构

  • 代码段以.text为开始标志
  • 其实就是各项指令操作
  • 程序入门为main:标志

9.基本模板

# Comment giving name of program and description of function
# 说明下程序的目的和作用(其实和高级语言都差不多了)
# Template.s
#Bare-bones outline of MIPS assembly language program


          .data       # variable declarations follow this line
                   # 数据变量声明
                      # ...

          .text       # instructions follow this line  
              # 代码段部分                                                          
main:                 # indicates start of code (first instruction to execute)
                      # 主程序
                      # ...

# End of program, leave a blank line afterwards to make SPIM happy

注意多给一行

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇