在 x64 上,每个 PUSH 指令是否推送 8 字节的倍数?

2024-03-04

在 x64 上,每个 PUSH 指令是否压入 8 字节的倍数?如果没有的话,推力有多大?

另外,每个函数参数消耗多少堆栈空间?


64 位模式下的 PUSH 操作数大小

压入堆栈的值的大小以及堆栈指针调整的量取决于 PUSH 指令的操作数大小。在 64 位模式下,操作数大小只能是 16 位或 64 位。无法在 64 位模式下编码 32 位 PUSH 指令,也不可能在任何模式下编码 8 位 PUSH 指令。

例如,这些都是 64 位 PUSH 指令:

push    rax
push    1              ; 8-bit immediate sign-extended to 64 bits
push    65536          ; 32-bit immediate sign-extended to 64 bits
push    QWORD PTR[0]
push    fs             ; 16-bit segment register zero-extended to 64 bits

以上指令都是将RSP减去8,然后将一个64位值写入RSP指向的位置。

这些都是 16 位 PUSH 指令:

push    ax
push    WORD PTR[0]

这些指令从 RSP 中减去 2,然后将 16 位值写入 RSP 指向的位置。因为它们严重错位堆栈,所以在 64 位模式下使用 16 位 PUSH 几乎总是一个错误。相反,您应该将 16 位值加载到寄存器中(如果尚未存在),根据需要扩展它,然后使用 64 位 PUSH。

以下指令是非法的,不能以 64 位模式编码:

push    al
push    eax
push    BYTE PTR[0]
push    DWORD PTR[0]
push    0100000000h    ; 64-bit immediate value isn't supported

将 8 位或 32 位值压入堆栈需要将该值加载到寄存器中,对其进行扩展,然后使用 64 位 PUSH,就像处理 16 位值一样。

64位模式下的参数传递

一般来说,在 64 位模式下,函数参数不会在堆栈上传递。 Microsoft 和 Linux 64 位 x86 调用约定都在寄存器中传递大多数参数。仅当寄存器中没有足够的空间来将参数传递给函数时才使用堆栈。在这种情况下,每个参数占用一个或多个 8 字节堆栈槽。请注意,编译器不一定使用 PUSH 指令将这些参数放入堆栈中。常见的策略是在堆栈上为函数序言中的所有函数传出参数分配足够的空间,然后根据需要使用 MOV 指令将参数放入堆栈中。

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

在 x64 上,每个 PUSH 指令是否推送 8 字节的倍数? 的相关文章

  • 为什么这个 C++ 包装类没有被内联掉?

    EDIT 我的构建系统出了问题 我还在弄清楚到底是什么 但是gcc产生了奇怪的结果 尽管它是 cpp文件 但是一旦我使用了g 然后它按预期工作 对于我一直遇到麻烦的事情来说 这是一个非常精简的测试用例 其中使用数字包装类 我认为会内联 使我
  • 在 REP MOVSW 之前 PUSH CS / POP DS 的目的是什么?

    为什么在下面的代码中我们压入代码段 PUSH CS 然后将其弹出到数据段 POP DS 我将这些行明确指定为 line1 和 line2 请告诉我 MOVSW 在这里是如何工作的 IF HIGHMEMORY PUSH DS MOV BX D
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • 使用 (float&)int 进行类型双关可以正常工作,(float const&)int 会像 (float)int 一样转换吗?

    VS2019 发布 x86 template
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 这种没有推送寄存器的交换有多安全?

    我对汇编非常陌生 下面的代码应该通过两个不同的函数交换两个整数 首先使用swap c然后使用swap asm 但我怀疑 我是否需要push 我的意思是保存 汇编代码之前寄存器的每个值和pop稍后 就在返回之前 main 换句话说 如果我返回

随机推荐

  • 无法安装 ruby​​ gems - zlib 错误

    我正在尝试安装一些 Ruby Gems 以便在收到 Twitter 消息时可以使用 Ruby 来通知我 然而 在做了一个gem update system 现在每次我尝试执行以下操作时都会出现 zlib 错误gem install任何东西
  • 为什么我下载文件时我的移动运营商会重新编码?

    我在 Android 中发现了一个非常奇怪的现象 我发现 当下载超过 3g 的图像时 随后计算的 sha1 与服务器上的文件应有的不同 经过进一步调查 我发现图像实际上被缩小了尺寸并重新编码 我的移动运营商 verizon 似乎正在尝试优化
  • String.format 使用 exception.getMessage() 作为格式

    我有一个与 JAVA 中的 String format 有关的问题 我的 HibernateDao 类负责持久化实体 并在发生任何约束违规时抛出异常 该消息包含 s 并将用作上层的格式 因为我应该担心这一层中的类型 因此无法识别我无法持久化
  • 无法使用 Windows 使用 ssh 密钥访问 gitlab 存储库

    我已关注这些说明 https docs gitlab com ee ssh generate an ssh key pair用于使用 ssh keygen 生成密钥对 当我试图找出问题所在时 我实际上生成了 ed25519 和 rsa 密钥
  • CSS 对角线 - 如何适应其父元素?

    我怎样才能使对角线填充并适合一个盒子 只是纯CSS 不使用任何背景图像 div diagonal container border 1px solid 000 width 400px height 400px margin 0 auto t
  • Vim 删除空行

    我可以运行什么命令来删除 Vim 中的空行 g d g将在与正则表达式匹配的行上执行命令 正则表达式是 空行 命令是 d 删除
  • 如何将回归线添加到具有按因子进行颜色编码的多个数据系列的图中?

    我希望将回归线添加到具有多个按因子进行颜色编码的数据系列的图中 使用brewer pal 调色板 我创建了一个图 其中数据点按因子 plant ID 着色 下面是代码示例 palette brewer pal 12 Paired plot
  • 导入错误:没有名为 Crypto 的模块

    我刚刚开始探索Python 我正在尝试运行 AES 算法代码 但我面临着 导入错误 没有名为 Crypto 的模块 你如何解决这个问题 您必须安装加密包 https pypi python org pypi pycrypto https p
  • 本地化静态网站的正确方法是什么

    我需要将我们的网站本地化为多种语言 该网站由多个静态页面组成 没有动态后端 我们有一个良好的国际社会 人们愿意帮助我们 问题是如何安排网站翻译 正确的工作流程是什么 静态网站本地化的最佳实践是什么 如何组织语言字符串包 如何组织从字符串捆绑
  • onreadystatechange 中 XHR 获取请求 URL

    有没有办法在 onreadystatechange 方法中获取请求的URL 我想运行多个 XHR 请求并知道其中哪个会返回 xhr open GET https url i true xhr onreadystatechange funct
  • django 剥离/删除/清除值

    我正在使用 django 1 6 7 和 python 2 7 我试图在将值提交到数据库之前清除字段中的数据 如果它符合条件 我一直在使用 strip 但这不再有效 搜索 django 文档后我找不到解决方案 这是我的 forms py 文
  • WPF 中的数字数据输入

    您如何处理 WPF 应用程序中的数值输入 如果没有 NumericUpDown 控件 我一直在使用 TextBox 并使用下面的代码处理其 PreviewKeyDown 事件 但它非常丑陋 有没有人找到一种更优雅的方式来从用户获取数字数据而
  • 如何在 NetBeans 平台中隐藏没有图层文件的菜单?

    我很难在 NetBeans 平台中自定义菜单 我看到的示例要求您拥有一个 Layer 文件 但我认为我的 NetBeans 平台项目中没有该文件 要通过图层隐藏菜单 您应该这样做
  • 使用 PHP eval 的风险[重复]

    这个问题在这里已经有答案了 可能的重复 什么时候 如果有的话 eval 不是邪恶的 https stackoverflow com questions 3499672 when if ever is eval not evil php 中的
  • 两个互相引用的类

    我是 C 新手 所以这个问题可能很基本 我有两个类需要互相引用 每个都在自己的头文件中 include 是另一个的头文件 当我尝试编译时 我收到其中一个类的错误 ISO C 禁止声明没有类型的 Foo 如果我切换事物 以便首先解析相反的标头
  • BottomNavigationView.setupWithNavController 不起作用

    目前我正在开发一个Android应用程序 我想在其中同时利用Android Navigation Component and BottomNavigationView 在开发上述应用程序时 我签出了官方代码实验室这里有几个问题 但事实证明它
  • Firebase Web:下载 URL 中的存储位置

    我正在编写一个需要存储位置的 firebase 函数 现在我有下载网址 有没有办法像这样获取存储位置 gs dexxxxxxxxxxxxxxxx com videosvideo 67423 http gs dekhoapp appspot
  • 如何存储 JWT 并使用 React 将它们与每个请求一起发送

    很高兴知道 因为我的基本注册 身份验证系统正在运行 所以基本上我得到了这个 app post login function req res Users findOne email req body email function err us
  • 使用 CL 寄存器进行移位会导致部分寄存器停顿吗?

    变量移位是否会产生部分寄存器停顿 或寄存器重组微指令 ecx 如果是 在哪种微架构上 我已经在Core2 65nm 上测试过这个 它似乎是只读的cl shiftbench push rbx mov edx 10000000 mov ecx
  • 在 x64 上,每个 PUSH 指令是否推送 8 字节的倍数?

    在 x64 上 每个 PUSH 指令是否压入 8 字节的倍数 如果没有的话 推力有多大 另外 每个函数参数消耗多少堆栈空间 64 位模式下的 PUSH 操作数大小 压入堆栈的值的大小以及堆栈指针调整的量取决于 PUSH 指令的操作数大小 在