Pushl %esp 是在存储之前还是之后更新 ESP?

2023-12-14

The pushlY86 指令将堆栈指针减 4 并将寄存器值写入内存。所以并不清楚处理器执行指令时应该做什么pushl %esp,因为被压入的寄存器正在被同一指令更改。可能发生两种可能的事件:

(1)推入原值%esp,或 (2) 压入递减的值%esp.

鉴于此,我们如何修改这段代码(相当于pushl REG考虑并适应这些歧义(REG 可以是 %esp 以及任何其他寄存器)?:

subl $4,%esp                   Decrement stack pointer
movl REG,(%esp)                Store REG on stack

同样,指令popl %esp可以设置%esp从内存中读取的值或递增的堆栈指针。如何更改此代码以适应这些歧义?:

movl (%esp),REG                Read REG from stack
addl $4,%esp                   Increment stack pointer

y86 基于 x86。这x86指令集参考手册条目push说(正确):

PUSH ESP 指令将 ESP 寄存器的值压入指令执行前的值。

And pop:

POP ESP 指令在旧堆栈顶部的数据写入目标之前递增堆栈指针 (ESP)。

所以在pop %esp这种情况下,增量就会丢失。尽管大多数真实的 CPU 可能会加载到临时内部存储器中,而不是在寻址模式中实际使用更新的 ESP 值,但该序列具有相同的效果。

add   $4, %esp
movl  -4(%esp), %esp

But pop %esp这样做不需要更新 FLAGS,并且在 add 和 mov 之间不可能出现中断或信号处理程序。 (单独的添加/移动序列在任何低于当前值的上下文中并不安全%esp可以被中断处理程序异步覆盖。)


y86 大概与 x86 做同样的事情。您可以轻松(并且应该)使用调试器进行检查看看你最喜欢的 y86 模拟器如何处理这个极端情况。push %esp通过查看内存(或添加一个pop %eax之后)。

同时测试两者会让人感到困惑,如果弹出的值与旧的堆栈指针相同,则无法区分。大概推一个0(或存储一个0 to (%esp)), then pop %esp并使用调试器查看寄存器中的值。 (如果您的代码随后崩溃也没关系,您只是使用了调试器。)

我没有检查y86是否支持push $0 or movl $0, (%esp)像x86。我想会是immovl $0, (%esp)如果支持(立即记忆)。如果没有,则将寄存器归零并推送。

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

Pushl %esp 是在存储之前还是之后更新 ESP? 的相关文章

  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 这种没有推送寄存器的交换有多安全?

    我对汇编非常陌生 下面的代码应该通过两个不同的函数交换两个整数 首先使用swap c然后使用swap asm 但我怀疑 我是否需要push 我的意思是保存 汇编代码之前寄存器的每个值和pop稍后 就在返回之前 main 换句话说 如果我返回
  • GCC的sqrt()编译后如何工作?使用哪种root方法?牛顿-拉夫森?

    只是对标准感到好奇sqrt 来自 GCC 上的 math h 我自己编码的sqrt 使用牛顿拉夫森来做到这一点 是的 我知道 fsqrt 但CPU是如何做到这一点的呢 我无法调试硬件 现代 CPU 中的典型 div sqrt 硬件使用 2
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v
  • 使用 Gas 生成与位置无关的代码 (-fPIC)

    我尝试在 x86 64 上创建共享库但失败 问题归结为以下代码 请不要介意 它没有多大意义 section data newline ascii n section text globl write newline type write n
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • ICC 中的 -O3 会扰乱内在函数,使用 -O1 或 -O2 或相应的手动汇编即可

    这是后续这个问题 http stackoverflow com questions 49791664 o2 in icc messes up assembler fine with o1 in icc and all optimizatio
  • 68000 汇编语言 - CMPI.B

    What are the contents of the CCR and D3 after the following instructions sequence executes Perform the calculation by ha
  • 如何在 MacOS 上使用 nasm 进行编译

    我正在尝试在汇编器上编译并链接我的第一个程序 我尝试编译以下代码 include stud io inc global main section text main xor eax eax again PRINT Hello PUTCHAR
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 汇编语言程序中连续两次相乘

    我正在使用 8086 模拟器以及 DOSBOX 和 MASM 我知道当我们将 8 位与 8 位相乘时 答案将是 16 位 al 8 bit ax 当我们将 16 位与 16 位相乘时 答案将是 32 位 ax 16 bit dx ax 但如
  • 将十进制转换为十六进制

    首先 这是家庭作业 我正在尝试将 5 位数字读入寄存器 bx 假定该数字不大于 65535 16 位 以下是我尝试这样做的方法 但是 当我尝试打印该号码时 我仅打印输入的最后一位数字 这让我猜测 当我向 bx 添加另一个数字时 它会覆盖以前
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使

随机推荐

  • 获取 18 号下一次出现的日期

    好的 所以我需要使用 PHP 来获取下一次出现 18 号的日期 例如 假设我在 2011 年 12 月 28 日运行了脚本 我需要一些能够输出 2012 年 1 月 18 日的代码 如果是 2011 年 4 月 9 日 我需要将代码吐出 2
  • 为什么括号会导致对象解除绑定?

    当我用括号包围一个新对象调用并立即调用它的方法时 Node 或者一般来说只是 v8 将抛出 TypeError this getName 不是函数 错误 如果我不将它包裹在括号中 则不会抛出任何错误this已正确绑定 function Gr
  • 使用javascript 下载base64 数据| IE11 [重复]

    这个问题在这里已经有答案了 我正在尝试使用 JavaScript 中的 window location href 下载 base64 数据 它在 Chrome 中工作正常 但相同的代码在 IE11 中不起作用 您能否让我知道解决方法或解决方
  • 连接单元格

    我有两个细胞 A 100x2 double 80x2 double 50x2 double B 100x5 double 80x5 double 50x5 double 我怎样才能将它们连接起来以获得类似的东西C cat 2 A B 对于每
  • 将编辑文本字段中的文本添加到电子邮件中

    我有一个应用程序 希望与我们联系 以便用户输入姓名 地址 电话号码和评论部分 然后他们将单击 撰写邮件 按钮 它将自动将文本加载到电子邮件中 已经解决了一些代码 但不确定如何将编辑文本中的文本放入我的电子邮件消息中 任何人对我如何做到这一点
  • 为什么 unittest.mock.ANY 不能与 Django 对象正常工作?

    我在 Django 中编写了一个测试 并且我using unittest mock ANY忽略字典中的某些值 这是测试 from django test import TestCase from django contrib auth im
  • 快速轴对齐单元格遍历算法

    给定一个轴对齐的正方形 分为四个大小相等的单元格 A B C 和 D 给定一条从点 s1 到点 s2 的线段 查找该段 如果有 遍历的单元格 按遍历顺序排序 的最快方法是什么 在上面的例子中 正确的结果是 第 1 段 D 分段 2 A B
  • 实体框架 EDMX - 实体复数修复

    我们发现复数化服务对某些单词存在一些错误 例如它认为 Campus 是复数 并用 Campu 将其单数化 无论如何 我们已经弄清楚如何使用 ICustomPluralizationMapping 接口向服务添加自定义映射 问题是 我们如何告
  • JavaFX 创建弹出窗口,无需外部库

    我怎样才能创建像这样的弹出窗口DatePicker班级来自javafx scene control DatePicker如这里所示 显示时 弹出窗口应位于所有其他组件的顶部 如此处所示 弹出窗口位于TextField 找到了一个非常简单的解
  • 关于异步返回类型

    想知道为什么我们应该指定这一点async方法确实返回任务对象 指定它似乎是多余的async关键字加上它很混乱 因为你并没有真正创建Task object 据我了解 编译器确实发出了创建任务对象所需的代码 无论是在等待调用还是用新任务包装返回
  • Rails 3:如何从 js.erb 文件调用 javascript 函数

    现在我已经升级到 Rails 3 我正在尝试找出分离和重用 javascript 片段的正确方法 这是我正在处理的场景 我有一个包含两个区域的页面 一个区域包含可拖动的元素 另一个区域包含可放置的元素 当页面加载时 我使用 jQuery 来
  • 单例模式的问题

    过去几天我一直在阅读有关单例模式的内容 人们普遍认为 需要它的场景很少 如果不是罕见的话 可能是因为它有自己的一系列问题 例如 在垃圾收集环境中 这可能是内存管理方面的问题 在多线程环境中 它可能会导致瓶颈并引入同步问题 从测试的角度来看令
  • 是否可以在 Java 运行时设置环境变量?

    是否可以在 Java 运行时设置环境变量 应用 在Java 1 5 java lang System 类中有 getenv 方法 我会 只需要一个 setenv 方法 是否可以修改java进程本身的环境变量 不在子进程中 通过JNI可以实现
  • android 检查数据库中是否存在记录

    我想检查 SQLite 数据库中是否存在记录 这是我到目前为止所做的 当我搜索已经存在的记录时 我从列表中的 EditText 获取值 code from activity class public View OnClickListener
  • 构建 DOM 中任何给定节点的 querySelector 字符串值

    我正在尝试找到一种方法来构建任何给定节点的 querySelector 字符串 换句话说 选择页面上的任何节点 是否可以遍历 DOM 并构建一个字符串 允许我将生成的字符串传递给 document querySelector 并取回我选择的
  • “class boost::asio::async_result”中没有名为“completion_handler_type”的类型

    我正在尝试编写一个可以使用 boost spawn 调用的堆栈协程 协程内部启动一个线程 等待线程结束 并获取线程生成的一个整数值作为协程的返回值 但是 我遇到了一个错误 有专家可以帮我看一下吗 我的环境是 Ubuntu22 04 GCC9
  • 按日期获取维基百科修订 ID 的 API [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何API可以按日期获取维基百科修订ID 而不是检查所有修订历史记录并提取该日期之前的最新修订 谢谢你 The 修订查询 API允许您传递时间
  • 将带有 html 的字符串保存为图像

    我有一个包含网页中整个 html 的字符串 我想将此字符串保存为具有所有 html 规则的图像 最后有来自网页的图像 我该如何用c 和asp net解决这个问题 您可以使用以下组件将 HTML 文件转换为 PDF http code goo
  • Cython:创建数组抛出“常量表达式中不允许”

    我尝试将一个复杂的函数从 Python 重写为 Cython 以大幅加快速度 但遇到以下问题 在使用 hh vers vector pyx 编译函数时 setup ext modules cythonize hh vers vector p
  • Pushl %esp 是在存储之前还是之后更新 ESP?

    The pushlY86 指令将堆栈指针减 4 并将寄存器值写入内存 所以并不清楚处理器执行指令时应该做什么pushl esp 因为被压入的寄存器正在被同一指令更改 可能发生两种可能的事件 1 推入原值 esp 或 2 压入递减的值 esp