没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
MIPS
汇编语言简要介绍
一、数据类型和文法、寄存器
1、数据类型和文法
(1)数据类型:字节,byte 占用 8bits;半字,halfword 占用 2 bytes(16bits);字,
word 占用 4bytes(32bits);双字,dword 占用 8bytes(64bits);
(2)一个字符需要 1 个 Byte 的空间;
(3)一个整数需要 1 个 Word(4 Bytes)的空间;
(4)MIPS 结构的每条指令长度都是 32bits,一个字的空间。
2、寄存器
(1)MIPS 体系架构有 32 个通用寄存器。在汇编程序中,可以用编号 0 到 31 来表示;
(2)也可以用寄存器的名字来进行表示, 例如: $v0、$v1、$s0、$sp、$ra….
(3)有两个特殊的寄存器 Lo, Hi, 用来保存乘法/除法的运算结果;此两个寄存器不能直
接寻址,只能用特殊的指令:mfhi 和 mflo 来存取其中的内容。(含义:mfhi = move from Hi,
mflo = Move from Low.)
(4)堆栈(Stack)的增长方向是: 从内存的高地址方向, 向低地址方向;
表格 1:寄存器的编号名称及分类
寄存器编号
寄存器名称
寄存器描述
0
$zero
第
0
号寄存器,其值始终为
0
1
$at
(Assembler Temporary)
是
Assembler
保留的寄存器
2、3
$v0,$v1
(values)
保存表达式或函数返回的结果
4-7
$a0-$a3
(arguments) 作为函数的前四个入参。在子函数调用的过
程中不 会被保留。
8-15
$t0-$t7
(temporaries) Caller saved if needed. Subroutines can use
without saving.供汇编程序使用的临时寄存器。在子函数
调用的过程中不会被保留。
16-23
$s0-$s7
(saved values) - Caller saved. A subroutine using one of
these must save original and restore it before exiting. 在子
函数调用的过程中会被保留。
24、25
$t8,$t9
(temporaries) Caller saved if needed. Subroutines can use
without saving.
供汇编程序使用的临时寄存器。在子函数
调用的过程中不会被保留。这是对
$t0 - $t7
的补充。
26、27
$k0,$k1
保留,仅供中断
(interrupt/trap)
处理函数使用
28
$gp
global pointer.
全局指针。
Points to the middle of the 64K
block of memory in the static data segment.
指向固态数据
块内存的
64K
的块的中间。
29
$sp
stack pointer 堆栈指针, 指向堆栈的栈顶。
30
$s8/$fp
saved value / frame pointer 保存的值/帧指针 其中的值在
函数调用的过程中会被保留
31
$ra
return address 返回地址
二、汇编语言程序结构框架
汇编源程序代码本质上是文本文件。由数据声明、代码段两部分组成。汇编程序文件应
该以.s 或.asm 为后缀,在 Spim 模拟器中进行模拟。
1、数据声明部分
在源代码中,数据声明部分以“.data”开始。声明了在代码中使用的变量的名字。同时,
也在主存(RAM)中创建了对应的空间。
2、程序代码部分
在源代码中,程序代码部分以 “.text”开始。这部分包含了由指令构成的程序功能代
码。代码以 main: 函数开始。main 的结束点应该调用 exit system call,参见后文有关“表 2:
系统调用的功能”。
3、程序的注释部分
使用“#”符号进行注释。每行以“#”引导的部分都被视作注释。
程序结构框架,如:
.data # 数据声明部分
# ... 变量类型:
# 字符串:
# .ascii string
# .asciiz string ;以空字符 null 结束
# 字类型:
# .word w1,w2,... ;32 位,4 个字节
# 半字类型:
# .half h1,h2,... ; 16 位,2 个字节
# 字节类型:
# .byte b1,b2,... ; 8 位,1 个字节
# 浮点数类型:
# .float f1,f2,... ; 32 位,4 个字节
# 双精度浮点数:
# .double d1,d2,... ; 64 位,8 个字节
# 空格符:
# .space n ; 8 位,1 个字节。n 个字节空间
.text # 代码声明部分
.globl main # 定义 main 为全程量
main: #主程序名称 main,以下为程序代码部分
# 编写的 MIPS 汇编语言程序是 MIPS 指令和伪指令的组合。
# 伪指令(pseudo instructions)是为了编程方便而对指令集进行的扩展。
# 程序结束
四、MIPS 指令的三种格式:
其中,
op:为操作码;
rs:为第 1 个源操作数寄存器,寄存器地址(编号)是 00000~11111,00~1F;
rt:为第 2 个源操作数寄存器,或目的操作数寄存器,寄存器地址(同上);
rd:为目的操作数寄存器,寄存器地址(同上);
sa:为位移量(shift amt),移位指令用于指定移多少位;
funct:为功能码,在寄存器类型指令中(R 类型)用来指定指令的功能;
immediate:为 16 位立即数,用作无符号的逻辑操作数、有符号的算术操作数、数据
加载(Laod)/数据保存(Store)指令的数据地址字节偏移量和分支指令中相对程序计数
器(PC)的有符号偏移量;
五、关于 MIPS 伪指令与 MIPS 指令的转换关系
表 1:一些 MIPS 伪指令与指令的转换关系举例
MIPS 伪指令
功能描述
实 现 前 伪 指 令 功 能 所
需相应的 MIPS 指令及
方法
功能描述
move $t2,$t4
$t2<-$t4
addu $t2,$zero,$t4
$t2<-$zero + $t4
b imm16
无条件转移,
pc<-pc+4+sign-ex
tend(imm16)
beq $zero,$zero,imm16
$zero=$zero
,
pc<-pc+4+sign-extend(imm16)
li $t1,10
$t1<-10
ori $t1,$zero,10
$t1<-$zero | 10
la $t2,0x1000056c
$t2<-0x1000056c
lui $at,0x1000
0x1000=4096,
0x10000=65536
$at <- 4096*65536 ;
将 16 位立即数放到目标寄存
器($at)高 16 位,目标寄存器
的低 16 位填 0
ori $t2,$at,0x056c
$t2<-$at | 0x056c,
$t2<-重新合并该数
beqz $t1,imm16
If $t1=0
beq $t1,$zero,imm16
If $t1=$zero
剩余12页未读,继续阅读
资源评论
zgrobben
- 粉丝: 10
- 资源: 43
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Surfer,线性函数
- MyBatis 的动态 SQL 是其核心特性之一.txt
- 时代的sdddsddsddsd
- 基于哈希链表的简单人员信息管理系统
- 其他类别JdonFramework开源框架 v5.1 Build20071025-jdonframework-5.1.rar
- 2001~2022年上市公司数字赋能指数.dta
- 2001~2022年上市公司数字赋能指数.xlsx
- 信息办公石大在线财务管理系统(含源码)-shidacaiwu.rar
- 信息办公电信计费系统完整代码-netctossconformity.rar
- matlab实现TD-SCDMA中初始同步捕捉DwPTS下行同步导频时隙的仿真.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功