tips of MIPS
指令长度和寄存器个数 0 zero 永远返回值为0 这些寄存器的用法都遵循一系列约定。这些约定与硬件确实无关,但如果你想使用别人的代码,编译器和操作系统,你最好是遵循这些约定。 寄存器名约定与使用 *at: 这个寄存器被汇编的一些合成指令使用。如果你要显示的使用这个寄存器(比如在异常处理程序中保存和恢复寄存器),有一个汇编directive可被用来禁止汇编器在directive之后再使用at寄存器(但是汇编的一些宏指令将因此不能再可用)。 *v0, v1: 用来存放一个子程序(函数)的非浮点运算的结果或返回值。如果这两个寄存器不够存放需要返回的值,编译器将会通过内存来完成。详细细节可见10.1节。 *a0-a3: 用来传递子函数调用时前4个非浮点参数。在有些情况下,这是不对的。请参考10.1细节。 * t0-t9: 依照约定,一个子函数可以不用保存并随便的使用这些寄存器。在作表达式计算时,这些寄存器是非常好的暂时变量。编译器/程序员必须注意的是,当调用一个子函数时,这些寄存器中的值有可能被子函数破坏掉。 *s0-s8: 依照约定,子函数必须保证当函数返回时这些寄存器的内容必须恢复到函数调用以前的值,或者在子函数里不用这些寄存器或把它们保存在堆栈上并在函数退出时恢复。这种约定使得这些寄存器非常适合作为寄存器变量或存放一些在函数调用期间必须保存原来值。 * k0, k1: 被OS的异常或中断处理程序使用。被使用后将不会恢复原来的值。因此它们很少在别的地方被使用。 * gp: 如果存在一个全局指针,它将指向运行时决定的,你的静态数据(static data)区域的一个位置。这意味着,利用gp作基指针,在gp指针32K左右的数据存取,系统只需要一条指令就可完成。如果没有全局指针,存取一个静态数据区域的值需要两条指令:一条是获取有编译器和loader决定好的32位的地址常量。另外一条是对数据的真正存取。为了使用gp, 编译器在编译时刻必须知道一个数据是否在gp的64K范围之内。通常这是不可能的,只能靠猜测。一般的做法是把small global data (小的全局数据)放在gp覆盖的范围内(比如一个变量是8字节或更小),并且让linker报警如果小的全局数据仍然太大从而超过gp作为一个基指针所能存取的范围。 并不是所有的编译和运行系统支持gp的使用。 *sp: 堆栈指针的上下需要显示的通过指令来实现。因此MIPS通常只在子函数进入和退出的时刻才调整堆栈的指针。这通过被调用的子函数来实现。sp通常被调整到这个被调用的子函数需要的堆栈的最低的地方,从而编译器可以通过相对於sp的偏移量来存取堆栈上的堆栈变量。详细可参阅10.1节堆栈使用。 * fp: fp的另外的约定名是s8。如果子函数想要在运行时动态扩展堆栈大小,fp作为桢指针可以被子函数用来记录堆栈的情况。一些编程语言显示的支持这一点。汇编编程员经常会利用fp的这个用法。C语言的库函数alloca()就是利用了fp来动态调整堆栈的。 如果堆栈的底部在编译时刻不能被决定,你就不能通过sp来存取堆栈变量,因此fp被初始化为一个相对与该函数堆栈的一个常量的位置。这种用法对其他函数是不可见的。 * ra: 当调用任何一个子函数时,返回地址存放在ra寄存器中,因此通常一个子程序的最后一个指令是jr ra. 子函数如果还要调用其他的子函数,必须保存ra的值,通常通过堆栈。 对於浮点寄存器的用法,也有一个相应的标准的约定。我们将在7.5节。在这里,我们已经介绍了MIPS引入的寄存 1、MIPS指令集的确很RISC,数据类的仅有load、store和move,当然按操作数的长短分许多lw、lh等等,但实际上就这三个。运算类的也仅仅完成基本功能,也根据操作数长短分了许多子指令。跳转类更少,要么无条件跳转,要么根据操作数跳转。这些指令确实属于最常用的80%的。相比Intel的LEA等指令,由于个人习惯,很少用,而AAD、AAA等指令,我几乎没用过。 2、MIPS指令较少,但汇编器为了方便使用,定义了许多伪指令,如li、ror等。最终会被扩展成多条实际指令。这样一来,好处就是能省力,但坏处就是对汇编器要求较高,而且对机器指令反汇编后难以还原为伪指令(反汇编器面对lui $at, 0xABCD和ori r, $at, 0xEF00似乎不能自作主张的将其视作li, r, 0xABCDEF00);反汇编出来的指令条数多,不利于hack(或许又是好事)。 3、MIPS的寻址方式最简单,仅有寄存器加偏移寻址方式(内嵌16位立即数寻址不算在内),这对于饱受Intel的八种寻址方式折磨的人来说是天大的好事。 4、MIPS没有栈操作指令,虽然有约定俗称的$sp。在做递归调用时必须手工管理栈,调用子程序时没有自动压栈的call指令,只能用jal。这对于用惯了intel的PUSH和POP的人又会是一场噩梦。 5、MIPS的内存映射、中断等功能都做到了协处理器0中,浮点运算做到了协处理器1 中。 6、MIPS寄存器非常多,对于表达式求值很有利,不过调度算法就复杂了。而且寄存器虽然有约定俗成的用法,但实际上并没有限制。 7、MIPS指令为定长的,很统一,给我的“感觉”非常好。 最终,个人体会,在MIPS体系下思考又是另一种感觉,由于栈是全手工管理,就不用考虑push、pop是否匹配以及操作数大小,但手工管理栈要求头脑非常清晰;由于寄存器多了,就更多的考虑寄存器调度,如何发挥出所有寄存器的潜力;也不用去费心思选择寻址方式。MIPS在寄存器使用、栈、存储方面提供了更高的灵活性,设计程序可以更加自由,但同时也增大了交流、学习的难度,这点与Intel严格的体系结构完全相反。 从MIPS的特性看来,由于MIPS指令集简单,容易设计和实现,尺寸可以做小,因此MIPS的方向除了嵌入式外,应该是多核心,提高并行度,主要面向并发性高的应用,如服务器。而在桌面应用方面,目前没有x86的优势明显。速度是一方面,MIPS的应用少,指令集太精简、对程序员的友好程度不够好也是一个原因。 |
参考阅读:
http://hi.baidu.com/qq520131714/blog/item/f28933245603072cd40742a6.html
http://dev.csdn.net/htmls/2/2300.html
http://www.52rd.com/blog/Detail_RD.Blog_hdguy_1902.html
转载于:https://blog.51cto.com/daisy8867/441348
tips of MIPS相关推荐
- AFL-FUZZ学习笔记:QEMU模式的使用(MIPS架构)
最近学习用AFL(American Fuzzy Lop)进行漏洞挖掘,简单的记录一下AFL的QEMU模式的使用. 首先创建测试用例:test.c #include <stdio.h> #i ...
- Tips——IndexSearcher自动更新
情景描述 为了调高效率,创建全局变量IndexReader取代每次查询新建IndexReader所带来的效率问题. 当时每天会更新一边索引8.23号部署的Index服务,Search服务,结果inde ...
- 转:45 Useful JavaScript Tips, Tricks and Best Practices
原文来自于:http://flippinawesome.org/2013/12/23/45-useful-javascript-tips-tricks-and-best-practices/ 1 – ...
- Android开发中libs包下面的mips、armeabi、armeabi-v7a和x86
简介 在Android日常的开发过程中有的项目需要引入第三方的库,有时候大家可能会在libs文件夹下看到 mips.armeabi.armeabi-v7a和x86这四个文件夹.那么这三个文件夹下面的包 ...
- 2012关于钱的Tips
对于目前的我来说,死工资是唯一的财富积累手段,而且工资本身还不足够满足所有的物质和精神需求.以此为前提,对钱的来龙去脉有一个了解.把控是极其有必要的. 2011钱的规划基本为零,一年下来惊恐的发现,似 ...
- Tips系列之飞书日历
最近收到很多小伙伴的问题,咨询飞书日历如何使用,今天就给大家呈上几个小Tips,让你更全面的了解飞书日历!
- 从39个kaggle竞赛中总结出来的图像分割的Tips和Tricks(附资源)
来源:AI公园 本文约2700字,建议阅读10分钟 本文与你分享参加了39个Kaggle比赛的技巧和经验. 想象一下,如果你能得到所有的tips和tricks,你需要去参加一个Kaggle比赛.我已经 ...
- FFMPEG Tips (5) 如何利用 AVDictionary 配置参数
本文是我的 FFMPEG Tips 系列的第五篇文章,准备介绍下 ffmpeg 提供的一个非常好用的健值对工具:AVDictionary,特别是对于没有 map 容器的 c 代码,可以充分利用它来配置 ...
- What are some time-saving tips that every Linux us
2019独角兽企业重金招聘Python工程师标准>>> Joshua Levy, Trust me. I'm a professional. Votes by Kartik Ayya ...
- ROS编程: 一些Tips
接触了快一年的ROS, 这段时间个人而言, 似乎完全没在日常的编程中对线程/IPC有所考虑. 这说明ROS是一个很易用的框架, 在编程上了屏蔽了很多系统知识, 可以更加专注于逻辑/算法等. 但是从程序 ...
最新文章
- SpaceVim的配置+ e121:undefined variable:g:spacevim global config path
- [Github]watch和star的区别
- 输出apk_KT被横扫吞下五连败果 APK拿下首胜 小夫笑得十分开心
- el-table 行背景颜色_用手机拍花卉怎样使背景变黑?
- 学习笔记总结(VC)
- 两个div在同一行且不换行
- IPsec ***基础:认识IPsec ***
- datetime 索引_【免费毕设】ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)...
- 江苏大学考研885程序设计 - 填空选择知识点
- Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系
- 图像等比例缩放的函数封装(PHP)
- 网页前端培训笔记(JavaScript基础语法篇一)
- Intellij IDEA中拉svn分支
- 苹果手机用计算机打不开,苹果手机更新ios11后,照片在电脑上打不开怎么办?...
- 数据学习(十)-假设检验
- WPF Behavior 行为
- Ubuntu18.04 ROS Melodic版本安装gazebo_ros_pkgs包
- 【嵌入式操作系统-2】Cortex-M7处理器编程者模型
- HDU:4535 吉哥系列故事——礼尚往来(数学:错排)
- 微信王者抢先服是什么服务器,王者荣耀抢先服是什么?王者荣耀抢先服介绍