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

为什么在MIPS中没有RET指令,而x86有RET指令?

在MIPS架构中没有RET指令,而x86架构中有RET指令的原因是因为两种架构的设计理念和指令集的不同。

MIPS架构是一种精简指令集计算机(Reduced Instruction Set Computer,RISC),它的设计目标是简化指令集,提高指令执行效率。在MIPS架构中,函数的返回是通过将返回地址存储在特定的寄存器中,然后使用JUMP指令(或者JR指令)跳转到该地址。这种设计可以减少指令的数量和复杂度,提高指令执行的效率。

而x86架构是一种复杂指令集计算机(Complex Instruction Set Computer,CISC),它的设计目标是提供更多的指令和功能,以便开发人员可以更方便地编写复杂的程序。在x86架构中,函数的返回是通过使用RET指令实现的。RET指令会从栈中弹出返回地址,并跳转到该地址。这种设计可以简化函数的返回过程,使得编写和调试程序更加方便。

总结起来,MIPS架构中没有RET指令是因为它采用了精简指令集的设计理念,通过将返回地址存储在寄存器中并使用跳转指令实现函数的返回。而x86架构中有RET指令是因为它采用了复杂指令集的设计理念,通过RET指令从栈中弹出返回地址并跳转到该地址实现函数的返回。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

汇编语言知识总结

进行反编译逆向 装X 常见的cpu架构 x86 架构 : PC 端主流 高性能高功耗 ARM 架构: 移动端主流 体积小低功耗 MIPS 架构: 龙芯3号 国产cpu 不同架构使用的指令集也不一样,...通用寄存器的命名 x86架构 , 一共有四个通用寄存器,以16位x86为例, 分别取名为ax,bx,cx,dx 最大只能装16位的数据 ARM架构, 一共有31个通用寄存器,以64位arm为例...从x0到x30 MIPS架构,, 一共有32个通用寄存器 ,从0到31 x86架构,不同精度cpu 通用寄存器名称有所区分: ;x86架构,不同精度cpu 通用寄存器名称有所区分: 0x1122334455667788..., 那么这三条线就是干这个用的 x86汇编语法 注释 ;我是注释 了解: arm汇编注释同为; mips汇编注释为# 变量取值和赋值(传送指令) ;赋值 mov ax,2000H ;将十六进制2000...str mov ah 9ch int 21h ret ;函数结尾标记 函数调用 x86架构中使用关键指令call, ARM架构中使用关键指令bl x86架构汇编示例: call

2.7K20

深入iOS系统底层之指令集介绍

我们不可能让ARM指令直接在X86的CPU上执行(就如OC的提供方法无法Java执行是一个道理)。...x86现在几乎是个人计算机的标准平台,成为了历来最成功的CPU架构。其他公司也有制造x86架构的处理器:AMD、Cyrix、NEC、IBM、IDT以及Transmeta等。...比如32位的应用程序能够64位的CPU上执行,小字长的CPU指令集则无法直接提供大字长指令集的能力,如需要支撑则通常都是通过模拟来完成的,比如说一个64位字长CPU的读取数据指令32位字长CPU上就可以通过模拟两次读取来完成...目前,桌面计算机流行的x86体系结构即使用CISC。CISC微处理器,程序的各条指令是按顺序串行执行的,每条指令的各个操作也是按顺序串行执行的。...由于实际情况,采用多指令流处理多数据流才是更有效的方法,因此MISD只是作为理论模型出现,没有投入到实际应用之中。

1K10
  • 如何半天学会一门汇编

    没有。 但在现实生活,还是不少地方用到汇编语言,除了搞嵌入式之外,C/C++,OC之类的语言,定位程序崩溃,内存泄露,逆向破解,漏洞挖掘和分析,恶意软件分析,都会用到。...x86下,cdecl调用方式,基本上,参数都是通过栈来传递,返回值是通过eax传递,栈是由esp来控制,this指针是通过ecx(windows下)或栈(Linux)。函数桢用ebp指向。...返回地址栈上。 mips下,参数都是通过a0-a7传递的,多余的则放在栈上,通过sp来指向,返回值往往一般只通过v0返回。this指针一般作为第一个参数用a0传递。函数桢用fp指向。...这上面是我曾经搞过的CPU平台,其中x86和sparc是08-10年时,mips是11年-12年接触的。iOS是2020年搞了一天,只是为了看看jailbreak反检测机制。...程序的执行顺序就构成了程序的骨架,也就是说,由于汇编和机器码是一一对应的,汇编,只要找到if/else/switch/continue/break/while/do/for之类以及函数调用的对应指令或特征

    83010

    Gadget构造:从JIT-ROP到对抗XnR

    在这之后,攻击者为了绕过DEP,开始利用libc.so的函数获取shell,也就是我们所说的Ret2libc攻击。...如上右图,攻击者是可以确定,编译结果中肯定包含‘je 0xc380cd’这一句的(x86/x64 架构采用小端存储)。所以说,通过变化ifjs代码的大小,我们可以修改代码长度,改变跳转的距离。...具体攻击流程三步: (1)找到call指令后那个被调用函数的地址。 再列一遍这个式子,0x2000-0x5=0x1ffb。在这里0x2000就是被调用函数的地址。...Javascript的check address函数会读栈数据,直到找到call指令放置的ret,可知是否放置正确。如果没有,重新编译,重复之前的步骤。...其他 这攻击主要针对的是x86 (32- or 64-bit)架构。RISC架构,如ARM,MIPS,由于硬件层次的原因,利用上文所述的方法不能成功攻击。

    1.8K40

    CPU_X86架构和ARM架构入门篇

    ---- 视频解读 CPU的x86和ARM架构啥区别?指令集又是啥?...Intel最初并没有开发64位版本的x86指令集。64位的指令集名为x86-64(有时简称为x64),实际上是AMD设计开发的。Intel做的64位计算,是搞了一个新64位处理器项目名为IA64。...ARM通过big.LITTLE向移动设备推出了异构计算。这意味着处理器的核可以不同的性能和功耗。当设备正常运行时,使用低功耗核,当你需要高计算能力时,使用的是高性能的核。 ?...现在主流的制程工艺10nm-14nm,主流ARM架构CPU和X86架构CPU的制程工艺相差不大。 其次和设计相关。 X86为了增强对乱序操作的处理能力,加强了乱序指令的执行。...此外,X86还增强了单核的多线程能力。,性能高,功耗高。 ARM的指令确定次序的执行,并且依靠多核不是单核多线程来执行。这样容易保持子模块和时钟信号的关闭,显然就更省电。

    4.4K21

    《coredump问题原理探究》Linux x86版3.5节栈布局之-fomit-frame-pointer编译选项

    可见,通过-fomit-frame-pointer编译选项编译出来的程序没有 push %ebp mov %esp,%ebp 和 pop %ebp ret 这些开头和结尾的特征指令...探索这种情况下的规律,先用函数桢指针单链表规律来假设一下没有用-fomit-frame-pointer编译选项编译出来的程序执行test到func时候,栈的变化: 1.      ...压入func函数的参数(由于test只调用一个函数func,所以,直接把参数归并到局部变量空间分配,没有用push指令) 5.      ...其中func2的局部变量空间大小为var_size,func3压入栈的参数大小为par_size,那么它们会满足下面的条件: 1. addr(ret1)-addr(ret2)= var_size +...par_size + 4 2. info symbol ret1, info symbol ret2都能够显示出func1, func2 PS:这个规律是更加通用的,不止x86平台下,sparc,mips

    65120

    从 0 开始学 Linux 内核之 android 内核栈溢出 ROP 利用

    作者:Hcamael@知道创宇404实验室 最近在研究一个最简单的android内核的栈溢出利用方法,网上的资料很少,就算也是旧版内核的,新版的内核了很大的不同,如果放在x86上本应该是很简单的东西...,但是arm指令很大的不同,所以踩了很多坑。...本篇开始学Linux kernel pwn了,内核能搞的也就是提权,而提权比较多人搞的就是x86和arm指令集的Linux系统提权了,arm指令集的基本都是安卓root和iOS越狱,mips指令集的几乎没啥人在搞...,arm32栈的大小是0x2000,thread_info的信息储存在栈的最底部 所以,如果我们能获取到当前进程在内核运行时的其中一个栈地址,我们就能找到thread_info,从而顺藤摸瓜得到...,但是该指令却只存在于该函数之前,无法找到相关的gadget,之后我想了很多利用该函数的方法,最后测试成功的方法是: 计算漏洞的溢出函数的栈和ret_fast_syscall函数栈的距离,使用ROP

    1.5K30

    从 0 开始学 Linux 内核之 android 内核栈溢出 ROP 利用

    作者:Hcamael@知道创宇404实验室 最近在研究一个最简单的android内核的栈溢出利用方法,网上的资料很少,就算也是旧版内核的,新版的内核了很大的不同,如果放在x86上本应该是很简单的东西...本篇开始学Linux kernel pwn了,内核能搞的也就是提权,而提权比较多人搞的就是x86和arm指令集的Linux系统提权了,arm指令集的基本都是安卓root和iOS越狱,mips指令集的几乎没啥人在搞...,arm32栈的大小是0x2000,thread_info的信息储存在栈的最底部 所以,如果我们能获取到当前进程在内核运行时的其中一个栈地址,我们就能找到thread_info,从而顺藤摸瓜得到...,我也找不到问题的原因,执行完msr cpsr_c, r4指令以后,栈信息会发现变化,导致没法控制pc的跳转 不过后来,我跟踪内核的执行,发现内核本身是通过ret_fast_syscall函数来切换回用户态的...,但是该指令却只存在于该函数之前,无法找到相关的gadget,之后我想了很多利用该函数的方法,最后测试成功的方法是: 计算漏洞的溢出函数的栈和ret_fast_syscall函数栈的距离,使用ROP

    1.5K00

    一文带你厘清国产 CPU

    x86 市场,除了 Intel 和 AMD 之外,还有一家公司 cyrix。这家公司也有 x86 指令集的授权,但并没有开发出像样的产品出来,印象中出过几款 CPU,但市场占有率接近零。...再后来威盛和中国大陆组建合资公司,这就是兆芯为什么 x86 架构的 CPU 的原因。现在上海兆芯背后资源雄厚,在台式机、笔记本领域打开了一些局面。很多信创系统就是使用了兆芯的 CPU。...既然 ARM 架构受制于人,那有没有别的架构呢?,这就是 MIPSMIPS指令集是精简指令集(RISC)的衍生架构之一,其设计理念是简化指令集,提高指令的执行效率。...龙芯最早就是设计 MIPS 芯片,发展过程,发展出属于自己的一套指令集,这就是 Loong Arch,不再受制于 MIPS。 自己设计 CPU 架构,不再受制于人,看起来很美好。...软件业,开源盛行。那芯片领域,有没有开源的可能呢?你还别说,真的,这就是 RISC-V。 RISC-V是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。

    39510

    arm架构和riscv架构_开源芯片架构

    从这里可以看到,对于命令别人做事这样一件事情,不同的人不同的理解,有人认为,如果我首先给接受命令的人以足够的训练,让他掌握各种复杂技能(即在硬件实现对应的复杂功能),那么以后就可以用非常简单的命令让他去做很复杂的事情...Intel并没有开发64位版本的x86指令集。64位的指令集名为x86-64(有时简称为x64),实际上是AMD设计开发的。...ARM在看到移动设备对64位计算的需求后,于2011年发布了ARMv8 64位架构,这是为了下一代ARM指令集架构工作若干年后的结晶。...ARM设计的巧妙之处,是处理器在运行可以无缝地两种模式间切换。...英特尔和AMD的“专属”,PC市场上独霸多年,地位不可撼动 2 ARM 移动端和便捷设备上有着不可替代的优势 3 MIPS 在网关、机顶盒等市场上非常受欢迎 4 RISC-V 虽然出来不久,但在智能穿戴产品上的应用广泛

    1.4K20

    x64架构下Linux系统函数调用

    一、 函数调用相关指令 关于栈可以看下我之前的这篇文章x86 CPU与IA-32架构 开始函数调用约定之前我们需要先了解一下几个相关的指令 1.1 push pushq 立即数 # q/l是后缀...1.4 ret ret指令用于从子函数返回,ret指令会先弹出当前栈顶的数据,这个数据就是先前调用这个函数的call指令压入的“下一条指令的地址”,然后跳转到这个地址执行。...x86的32位机器之上C语言一般是通过栈来传递参数,且一般都是倒序push,即先push最后一个参数再push倒数第二个参数,并通过ax寄存器返回结果,这称为cdecl调用约定(C三种调用约定,linux...3.3 栈的对齐问题 System V AMD64要求栈必须按照16字节对齐,就是说通过call指令调用目标函数之前栈顶指针即rsp指针必须是16的倍数。...: pushq %rbp # 将当前栈基底地址压入栈 movq %rsp, %rbp # 将栈基底地址修改为栈顶地址 subq $16, %rsp # 栈顶地址-16,栈扩容,这里没搞懂为什么要扩容

    11010

    通过一篇文章让你了解什么是函数栈帧

    二、 理解函数栈帧能解决什么问题 理解函数栈帧什么用呢? 只要理解了函数栈帧的创建和销毁,以下问题就能够很好的额理解了: 局部变量是如何创建的? 为什么局部变量不初始化内容是随机的?...压栈操作使得栈增大,弹出操作使得栈减小。 经典的操作系统,栈总是向下增长(由高地址向低地址)的。 我们常见的i386或者x86-64下,栈顶由成为 esp 的寄存器进行定位的。...x86架构指令的执行是按照一条一条的顺序进行的。EIP寄存器存储了下一条将要执行的指令的内存地址。当一条指令执行完毕后,EIP会自动递增,指向下一条指令的地址。...总之,EIP寄存器x86架构起着非常重要的作用,它存储了即将执行的指令的地址,控制着程序的执行流程。...,其实就是存储到main函数ret变量此时eax中就是Add函数中计算的x和y的和,可以看出来,本次函数的返回值是由eax寄存器带回来的。

    25510

    android开发 加载so库的解析和出现的各种错误分析

    X86构架属于典型的CISC,指令集丰富,指令不等长,善于执行复杂工作,更强调串行性能,它的整体运算能力要比只为移动而生的ARM架构强大,并且PC领域已经广泛应用,拥有深厚的技术背景。...Android设备加载so策略 不同CPU架构的android手机加载时会在libs下找自己对应的目录,从对应的目录下寻找需要的.so文件;如果没有对应的目录,就会去armeabi下去寻找,如果已经对应的目录...以x86设备为例,x86设备会在项目中的 libs文件夹寻找是否含有x86文件夹,如果含有x86文件夹,则默认为该项目x86对应的so可运行文件,只有x86文件夹文件夹下没有so,程序运行也是会出现...修复方式     添加SO:libs\armeabi\libBugly.so或加载代码注释掉://System.loadLibrary(Bugly) ; 2、进阶错误——根本木X86的SO,X86的设备上你加载个球啊...先写到这里,希望能让大家都so库一些基本的了解。肯定还有很多我没有介绍到的,希望大家多多交流。

    2.3K10

    Linux内核跟踪:ftrace hook入门手册(下)

    [nr]: 图2:Linux内核4.17版本do_syscall_64函数实现 如前一篇文章所述,ftrace hook是通过编译时处理,各个内核函数实现代码的开头插桩call指令,所以ftrace...经典方案通常针对x86架构,并不是ftrace_set_filter_ip所设置的过滤器函数调用hook子程,而是在这个过滤器函数修改EIP/RIP寄存器到hook子程的入口地址。...hook子程并非在ftrace框架内调用,而是ftrace框架返回到系统调用时跳转到hook子程(没有回到真正的系统调用函数)。...我们可以将业务子程绑定到系统调用号,然后在外套子程根据系统调用号(x86架构是AX)来找到对应的业务子程;还可以在过滤器函数中将额外信息存放在返回值寄存器(x86架构还是AX)不影响其它运行流程...如果我们不希望这样,可以代码随便寻找一个返回指令x86为0xC3),然后在过滤器函数修改IP寄存器到这个返回指令的位置即可: #if defined(CONFIG_X86_64)||defined

    1.9K20

    CPU体系结构

    指令架构的引入,也让 CISC 和 RISC 的分界变得模糊了。 ? 指令架构的 CPU 里面,编译器编译出来的机器码和汇编代码并没有发生什么变化。...于是,大部分情况下,CPU 都可以从 Cache 里面拿到译码结果,不需要让译码器去进行实际的译码操作。这样不仅优化了性能,因为译码器的晶体管开关动作变少了,还减少了功耗。...MIPS MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线的数据相关问题...它最早是80年代初期由斯坦福(Stanford)大学Hennessy教授领导的研究小组研制出来的。MIPS 采用精简指令系统计算结构(RISC)来设计芯片。...移动端,安卓支持三类处理器(CPU):ARM、x86MIPS。 ARM无疑被使用得最为广泛。 x86因为普及于台式机和服务器被人们所熟知,然而对移动行业影响力相对较小。

    1.3K21

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

    龙芯已经MIPS架构上花费了20年的人力物力,也已经了一些技术上的沉淀。完全掉头转向RISC-V开源指令集也是不太现实的。...1.5.1 MIPS指令集的限制 所有的指令都是32位长度: 这意味着没有指令仅占用2个或3个字节的内存空间(也就是说,通常情况下,MIPS架构的二进制文件比X86架构大百分之二十或三十),也没有指令超过...像ARM和X86架构一个特定的sp寄存器。我们都知道,对于函数调用的实现,一些约定俗成的格式,比如说System V ABI。...硬件上,MIPS架构则是只保存了一个重新运行的地址,X86架构,还需要保存eflags、cs、eip、ss和esp等寄存器。所以,MIPS的中断处理更为简单。...如果是没有可以安排的指令,可以添加一个nop指令。这也是我们经常在MIPS架构的汇编代码中看到的处理方式。

    7.8K21

    Go汇编语法和MatrixOne使用介绍

    但是在数据库引擎,使用纯粹的Go语言会有力所未逮的时候。例如,向量化是数据库计算引擎常用的加速手段,Go语言无法通过调用SIMD指令来使向量化代码的性能最大化。...如无特殊说明,本文所指的汇编语言皆针对x86(amd64)架构。关于x86指令集,Intel和AMD官方都提供了完整的指令集参考文档。想快速查阅,也可以使用这个列表。...如果你面对的问题在这3个类别里面,并且没有现成的库可用,就可以考虑使用Go汇编。 为什么不用CGO?...+16(FP) RET 这四条汇编代码所做的依次是: 第一个操作数x放入寄存器AX 第二个操作数y放入寄存器CX CX加上AX,结果放回CX CX放入返回值所在栈地址 操作数顺序 x86汇编最常用的语法两种...8(FP) RET 实际代码,为了消除汇编函数调用带来的指令跳转开销,以及参数进出栈开销,使用的是批量化的版本。

    53330

    ROP系统攻击

    栈帧是程序运行栈的一部分 , Linux ,通过%esp和 %ebp寄存器维护栈顶指针和栈帧的起始地址 ,%eip是程序计数器寄存器 [1] 。...ROP不同于retum-to-libc攻击之处在于,R0P攻击以ret指令结尾的函数代码片段 ,不是整个函数本身去完成预定的操作。从广义角度讲 ,return-to-libc攻击是ROP攻的特例。...最初ROP攻击实现在x86体系结构下,随后扩展到各种体系结构.。与以往攻击技术不同的是,ROP恶意代码不包含任何指令,将自己的恶意代码隐藏在正常代码。因而,它可以绕过W⊕X的防御技术。...内在特征 ROP也有其不同于正常程序的内在特征: (1)ROP控制流,call和ret指令不操纵函数,而是用于将函数里面的短指令序列的执行流串起来,但在正常的程序,call和ret分别代表函数的开始和结束...; (2)ROP控制流,jmp指令不同的库函数甚至不同的库之间跳转,攻击者抽取的指令序列可能取自任意一个二进制文件的任意一个位置,这很不同于正常程序的执行。

    1.4K20
    领券