首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MIPS架构深入理解2-MIPS架构体系

对于MIPS指令集架构描述最好的,肯定是MIPS公司出版的MIPS32和MIPS64架构规范。MIPS32是MIPS64的一个子集,用于描述具有32位通用目的寄存器的CPU。...好消息是,几乎每一个版本的MIPS架构,都有一个作为所有实现的父版本存在。 MIPS I: 最早的32位处理器(R2000/3000)使用的指令集,几乎每一个MIPS架构CPU都可以运行这些指令。...为此,一些编译器就通过实时运行时的gp指针完成这个优化。在编译或者汇编阶段,选择某些变量,把它们聚集到一起组成一块小的区域(不能超过64K)。把中间位置的变量地址存储在gp寄存器(也就是$28)中。...这也意味着,如果MIPS架构的CPU上运行的是一个没有内存映射的OS内核,则用户特权级是多余的。 另外,在用户模式下,一些指令,尤其是OS需要的CPU控制指令是非法的。...很多简单的系统(包括许多实时操作系统)一直处于内核模式运行。 2.7.3 64位地址映射 MIPS架构的地址总是通过一个寄存器的值加上16位的偏移计算得到。

5.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

从一道mips题目学习搭建mips环境及ROP

直接运行程序是运行不起来的,这是因为mips架构的elf文件需要在mips环境中才能运行,而且还需要相应的动态链接库。所以下面我们来一起搭建mips环境。要注意题目是什么环境,搭建的就得是什么环境。...我们常见的编译都是本地编译:编译出来的程序是由当前平台编译得到的,而且只能放到当前平台下运行;而交叉编译是指在当前平台下编译出在其他平台下运行的程序,即编译出来的程序运行环境与编译它的环境不一样。...直接运行题目会显示缺少共享库,我们可以将共享库复制到根文件夹下的lib文件夹下,也可以使用chroot更改根目录。运行题目。 ?...运行gdbserver,设置好ip端口以及要调试的程序。 ? 在本机使用gdb-mutiarch连接调试。...:mips-binaries-master,但是这个是MSB(大端)的,无法在小端的虚拟机里运行,遇到大端的题目可以使用。

2.8K20

MIPS架构深入理解1-MIPS和RISC架构体系介绍

MIPS领域最无法忽视的贡献者是Stanford大学的MIPS项目。...但是,如果程序中显式地使用short或者char类型的数据进行运算,支持MIPS架构的编译器必须额外地插入一些机器指令,保证结果能够像在真正的16位或8位机器上那样正确运行。...它把程序重新运行的地址保存到一个特定寄存器中,修改机器状态,然后禁止中断。做完这些后,跳转到一段保存到低内存中的预定义好的程序,之后的工作完全由软件控制。...硬件上,MIPS架构则是只保存了一个重新运行的地址,而像X86架构,还需要保存eflags、cs、eip、ss和esp等寄存器。所以,MIPS的中断处理更为简单。...但是,对于一个旨在多架构上运行的、允许中断或陷阱(trap)的通用系统,这两个寄存器的值随时会发生变化,最后不要使用它们。

6.9K11

MIPS架构深入理解10-向MIPS移植软件之内存序

牛顿 这是向MIPS架构移植软件的问题系列之第三篇。...在前两篇文章 *《MIPS架构深入理解8-向MIPS架构移植软件之大小端问题》 *《MIPS架构深入理解9-向MIPS移植软件之Cache管理》 中,我们分别讨论了大小端模式和Cache对于移植代码的影响...MIPS架构提供了sync指令实现这个目的,它可以确保sync指令之前的访问先于之后的执行。...对于上面的示例,为了让其在合适的系统上可靠地运行,writer任务应该在写关键域的值之前,调用一条sync指令;reader任务应该在读关键域的值之后插入一条sync指令。...比如,一个运行MIPS代码的CPU,实际上运行的store指令大约占所有指令的10%左右;但是,往往是突发式访问,比如函数的调用过程中,首先需要压栈操作一组寄存器的值。

90710

MIPS架构深入理解9-向MIPS移植软件之Cache管理

牛顿 这是向MIPS架构移植软件的问题系列之第二篇。上一篇《MIPS架构深入理解8-向MIPS架构移植软件之大小端问题》中,我们讨论了大小端对于移植代码的影响。...为此,MIPS架构提供了Cache指令,可以根据需要调用它们,消除这种内存和Cache的不一致性。...所以,MIPS32/64提供了synci指令,它可以执行D-Cache的回写操作和I-Cache的失效操作。具体可以参考MIPS指令集参考。...但是,对于运行中的代码,一般不要这样做。而且,不管是使用Cache程序地址,还是使用非Cache程序地址访问物理内存,一定要保证它的一致性。...4 Cache重影和页着色 我们在《MIPS高速缓存机制》一文中已经描述了Cache重影的根源。

1.2K10

汇编语言之MIPS汇编

简介 咱们知道x86架构cpu用于PC端和工作站较多,ARM架构cpu常见于手机和单片机,那么MIPS架构的cpu主要在哪些设备可以找到它们的身影呢?...中国龙芯 PS游戏机 学习环境搭建 安装JDK, 主要用于运行mips模拟器mars MARS模拟器:https://courses.missouristate.edu/KenVollmar/mars/...download.htm 寄存器 在mips中通用寄存器用$开头表示,一共有32个 寄存器编号 寄存器名 寄存器用途 $0 $zero 永远返回0 $1 $at 保留寄存器 $2-$3 $v0-$v1...MIPS汇编中的分段处理 .data #数据段 .text #代码段 传送指令 加载立即数指令 li li(load immediate) :用于将立即数传送给寄存器 li $t0,1 ;十六进制数据使用...$t1,sub # 如果$t0中的数据小于$t1,则跳转到sub分支,执行sub中的代码,否则,按照顺序执行bgt下面的代码, sub是一个代号,可以自定义 sub: 练习1: 将以下c代码转换成mips

9.5K30

MIPS架构深入理解11-向MIPS移植软件之编程语言

牛顿 这是向MIPS架构移植软件的问题系列之第四篇。...在前三篇文章 *《MIPS架构深入理解8-向MIPS架构移植软件之大小端问题》 *《MIPS架构深入理解9-向MIPS移植软件之Cache管理》 *《MIPS架构深入理解10-向MIPS移植软件之内存序...比如说,下面的这段代码,调用乘法指令mul,就可以在绝大数的MIPS架构CPU上运行。我们可以注意到,mul指令后面跟着三个源操作数。...3 在MIPS架构上使用C编写程序时的一些其它问题 负指针 当在MIPS架构上运行比较简单的程序时,一般直接运行在非映射内存区,也就是kseg0或kseg1区域时,所有32位数据指针的最高位都置1,看起来像是一个负数...而在其它架构上,运行这种程序一般都在低于2G的内存地址上,也就是直接对应物理地址。所以,MIPS架构的这种负指针,如果对其进行比较运算的话,指针可能会隐式地被转为一个有符号的整数类型。

1.1K30

MIPS架构深入理解8-向MIPS移植软件之大小端模式

所以,对于MIPS架构来说,完全可以把在其它架构上运行的软件拿来为其所用。 但是,这是一个说简单也简单,说复杂也复杂的工作。为什么这么说呢?...但是,像现在流行的一些实时操作系统,比如、μC/OS、Free-RTOS、RT-Thread或其它一些基于微内核的系统,它们的程序一般不通用,需要修改才能在其它平台上运行。...但是,对于MIPS架构来说,有些事情可能使用汇编语言编写更好。讲解这部分内容的时候,主要涉及inline汇编、内存映射I/O寄存器和MIPS架构可能出现的各种缺陷。...5 在MIPS架构上编写支持任意字节序的软件 你可能会想,我是否可以写一个正确运行MIPS CPU上的程序,不论它被配置为大端模式,还是小端模式。或者编写一个可以运行在任意配置的板子上的驱动程序。...正是这个特性使得MIPS CPU能够配置大小端工作模式。当你重新配置MIPS CPU的字节序时,正是改变了这个操纵数据加载的硬件逻辑单元的行为。

1.8K10

MIPS-DVRF_stack_bof_1

程序分析 首先将qemu-mipsel-static复制到squashfs的根目录,让我们可以正常运行程序 ? 通过IDA的简单分析大致可以得出程序需要添加参数运行,如上图所示 ?...使用下面命令来运行程序到1234端口,并加上python的cyclic函数来生成300个有序的字符 ?...接下来使用gdb-multiarch来连接程序 并在gdb开始时输入 set architecture mips 设置程序的架构为mips set endian little 设置字节序为小端序 target...输入c运行程序可以看到程序直接断到了0x63616162处也就是我们填充的字符串“baac” ? 最后使用cyclic命令可自动计算出溢出位为204,便可以控制程序的pc寄存器 ?...可以控制pc寄存器,便意味至我们可以让其直接运行到程序中的dat_shell函数上并getshell ?

76120

DDCTF 2018 逆向 baby_mips Writeup

所以对MIPS指令有一定研究,而在DDCTF 2018中刚好有一道逆向题目是MIPS程序,于是尝试做了一下。 0x01 环境搭建 由于我们通常的操作系统指令集都是x86的,所以无法跑MIPS程序。...由于MIPS架构有两种——大端MIPS和小端MIPS。所以,我们需要确定这个程序是大端MIPS还是小端MIPS。 ELF 32-bit LSB很明显,这个程序是32位小端的MIPS。...所以,我们使用qemu-mipsel baby_mips运行这个程序。...因为我们需要远程调试MIPS程序,所以要加上-g 端口参数,qemu-mipsel -g 1234 baby_mips,此时用IDA pro就可以通过Remote GDB Server来调试这个MIPS...然后,为了方便我们了解key比对函数的功能,我们可以需要对MIPS进行反编译,目前可以反编译MIPS程序的工具有两个。

1.5K50
领券