在 x86 汇编中的过程中调用 ret 指令是否重要

2023-11-21

我目前正在学习 x86 汇编。然而,当使用堆栈进行函数调用时,我仍然不清楚一些事情。据我所知,调用指令将涉及将返回地址压入堆栈,然后将要调用的函数的地址加载到程序计数器。 ret 指令会将这个地址加载回程序计数器。

我的困惑是,在过程/函数中调用 ret 指令是否重要?它总是能找到存储在堆栈上的正确返回地址,还是堆栈指针当前必须指向存储返回地址的位置?如果是这样的话,我们不能只使用push和pop而不是call和ret吗?

例如,下面的代码可能是进入函数的第一个代码,如果我们将不同的寄存器压入堆栈,则必须仅在以相反顺序弹出寄存器之后调用 ret 指令,以便在 pop %ebp 指令之后,堆栈指针将指向堆栈上返回地址所在的正确位置,或者无论在哪里调用它仍然会找到它?提前致谢

push %ebp
mov %ebp, %esp
//push other registers

...
//pop other registers
mov %esp, %ebp
(could ret instruction go here for example and still pop the correct return address?)
pop %ebp
ret

您必须将堆栈和非易失性寄存器保持原样。调用函数不知道您可能对它们做了什么,否则调用函数将简单地继续执行其下一条指令ret. Only ret当你清理完之后。

ret将始终在堆栈顶部查找其返回地址,并且将pop它进入EIP。如果ret是一个“远”返回,那么它也会pop将代码段放入CS注册(这也将被推动call对于“远”呼叫)。因为这些是首先推动的事情call,它们一定是最后弹出的东西ret。否则你最终会ret正在某个未定义的地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 x86 汇编中的过程中调用 ret 指令是否重要 的相关文章

  • 如何获取 VESA BIOS 信息

    我正在跟踪Phil Opp 教程 https os phil opp com 关于用 Rust 编写一个操作系统 在稍微尝试了一下之后 我想在屏幕上显示真实的图形 我发现我应该从使用带有 VESA 的线性帧缓冲区开始 我在 osdev or
  • 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

    我遇到了当前正在开发的应用程序的问题 问题是应用程序在启动时在后台运行一段时间后崩溃 并且仅在这种情况下 在应用程序被杀死时启动应用程序不会导致调试器或手机崩溃 无论是否进行调试 在后台启动应用程序大约 5 10 分钟都不会导致崩溃 在后台
  • C/C++ 中的简单“Hello World”内联汇编语言程序

    我使用 devcpp 和 borland c 编译器 asm mov ax 4 I O Func mov bx 1 Output func mov cx name address of the string mov dx 6 length
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 汇编中如何计算负数

    我是汇编新手 我有一个关于如何表示负数的问题 我有三个 DWORDS 变量 比方说 result DWORD 0 i DWORD 3 j DWORD 5 我想计算这个公式 结果 i j 8 但是 当我执行 i j 时 由于符号 结果将是一个
  • 为什么这个“std::atomic_thread_fence”起作用

    首先我想谈一下我对此的一些理解 如有错误请指正 a MFENCE在x86中可以保证全屏障 顺序一致性可防止 STORE STORE STORE LOAD LOAD STORE 和 LOAD LOAD 重新排序 这是根据维基百科 https
  • 遍历内存编辑每个字节

    我正在编写汇编代码 提示用户输入一串小写字符 然后输出包含所有大写字符的相同字符串 我的想法是迭代从特定地址开始的字节 并从每个字节中减去 20H 将小写变为大写 直到到达具有特定值的字节 我对 Assembly 相当缺乏经验 所以我不确定
  • 预取双类成员需要转换为 char*?

    我有一个正在使用的课程 mm prefetch 预先请求包含 double 类型的类成员的缓存行 class MyClass double getDouble return dbl other members double dbl othe
  • C++ 中的 CPUID 实现

    我想知道这里是否有人有一些可以从任何托管 net 语言引用的 C CPUID 实现的好示例 另外 如果情况并非如此 我是否应该注意 X86 和 X64 之间的某些实现差异 我想使用 CPUID 来获取运行我的软件的机器上的信息 崩溃报告等
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • 取消的分支与常规分支有何不同?

    特别是对于 SPARC Assembly 取消的分支与常规分支有何不同 我一直认为 当我需要填充分支指令的 nop 延迟槽时 需要取消分支指令 但是 我认为我在这一部分上是不正确的 因为您可以在不取消分支的情况下填充 nop 如果不采用分支
  • 为什么不能执行 mov [eax], [ebx] [重复]

    这个问题在这里已经有答案了 我可以做这个 mov eax ebx 和这个 mov eax ebx 甚至这个 mov eax ebx 但不是这个 错误C2415 mov eax ebx 只是wtf 为什么 它与 ptr1 ptr2 相同 为什
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r

随机推荐

  • 在 SQL Server 上使用或不使用 CONSTRAINT 关键字的区别

    使用和不使用有什么区别CONSTRAINT在 SQL Server 上使用外键时的关键字 我注意到在这个特定情况下显然两者的工作原理相同 没有CONSTRAINT CREATE TABLE ClientsPhones ClientPhone
  • Freemarker 转义 freemarker

    我正在使用 freemarker 生成 freemarker 模板 但我需要一些方法来逃避 freemarker 标签 我该如何逃脱 lt list gt 标签或 expression 您还可以使用 expression 如果您发现 嵌套令
  • XML 模式如何通过枚举限制属性

    我有以下 XML 标签
  • 如何在C++中显示固定位数而不进行四舍五入

    我有这个代码 非常基本 include
  • d3.js:将数据从父节点传递到子节点

    我正在使用 d3 制作堆积条形图 数据是一个数组 每个栏都有一个对象 例如 喜欢 然后每个对象都包含一个值数组 这些值驱动每个条形的各个矩形 data key likes values key blue frog value 1 key g
  • 用“.”分割字符串(点)处理缩写时

    我发现这很难解释 所以我将首先举几个我想要实现的目标之前 之后的例子 输入示例 你好世界 这是一个测试 特警队 S W A T s w a t 2001 A 太空奥德赛 想要的输出 你好世界 这是一个测试 特警队 SWAT swat 200
  • 如何使 mailto 主题和正文在 gmail 等中工作?

    下午好 我有一个带有 mailto 链接的网站 用于向我母亲的公司发送电子邮件 非常标准的东西 我最近尝试添加一些其他位来获得标准主题和正文 当我使用 Outlook 在我的工作电脑上 时 它可以工作 但如果我使用自动打开 gmail 的家
  • 通过反射访问抽象类的属性

    我有一个抽象类 让我们命名它Base 该类包含一些属性 而且 我还有另一个类 继承自 classBase 让我们命名它Child Child并不抽象 我想从类访问属性Base与反射 和only中声明的那些属性Base 下面的代码当然是不可能
  • 为什么 NSMetadataQueryDidUpdateNotification 被快速连续调用多次?

    为了监控 iCloud 容器中的文件更改 我注册了 NSNotificationCenter defaultCenter addObserver self selector selector processiCloudUpdates nam
  • 如何使用 TypeScript 在 Material UI 上添加自定义颜色名称?

    我正在使用 TypeScript 使用 Material UI 并希望向我的主题添加自定义颜色 一切工作正常 除了 VSCode linter 向我显示下一条消息 Type tan string lightRed string red st
  • 具有现有数据库和自定义文件路径的 Android Sugar ORM

    我完全能够使用提供的示例来使用 Sugar ORM 在我的用例中 我从服务器下载 SQLite DB 它的 ETL 负载有数百万条记录 因此必须在服务器端完成 下载保存到内部存储上的自定义路径 就我而言 我不需要基于 POCO 的动态数据库
  • .NET 的 HTML 生成器?

    在过去几年使用 Seaside 后 我发现模板系统的代码味道很糟糕 是否有一个 net 框架使用类似于 Seaside 画布系统的东西来生成 html css 和 javascript 或者是一种避免我在模板中发现重复的方法 编辑 NHam
  • 当页面被history.pushState和ajax调用更改时插入内容脚本

    我遇到了将内容脚本插入到由history pushState 和ajax 调用更改的页面中的问题 我找到了类似的话题在 stackoverflow 但该解决方案对我不起作用 该解决方案是使用 chrome webNavigation onH
  • PHP 是否允许命名参数,以便可以在函数调用中省略可选参数?

    PHP 中是否可以在调用函数 方法时指定命名可选参数 跳过您不想指定的参数 就像在 python 中一样 就像是 function foo a b c whatever foo hello c bar we want b as the de
  • 自定义验证属性 MVC2

    我有一个自定义验证属性 用于检查两个属性是否具有相同的值 例如密码和重新输入密码 AttributeUsage AttributeTargets Property AttributeTargets Field AllowMultiple f
  • 如何在 Eclipse 中访问内部 Java 包?

    我有一个使用 Java 11 或 Java 10 在 Eclipse 中打开的旧 Java 8 项目 Eclipse 现在正确地抱怨无法访问的包 例如 com apple laf AquaComboBoxUI 从命令行编译时 我可以通过添加
  • SQL BETWEEN 逆序运算符条件值

    为什么以下 SQL 查询会显示结果 SELECT FROM Products WHERE Price BETWEEN 10 AND 20 但是当我们改变值的顺序时它不会显示任何结果 SELECT FROM Products WHERE Pr
  • 如何使用 Linux Expect 脚本输入回答密码提示

    我在编写一个脚本来启动我的 forticlient vpn 命令行客户端并在出现提示时发送我的密码时遇到一些问题 这是我的代码 usr bin expect f set loadme forticlientsslvpncli server
  • SQL查询where子句[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我的 sql 查询中有这一行 WHERE client id AND isinvoice
  • 在 x86 汇编中的过程中调用 ret 指令是否重要

    我目前正在学习 x86 汇编 然而 当使用堆栈进行函数调用时 我仍然不清楚一些事情 据我所知 调用指令将涉及将返回地址压入堆栈 然后将要调用的函数的地址加载到程序计数器 ret 指令会将这个地址加载回程序计数器 我的困惑是 在过程 函数中调