为什么 x86-64 汇编中参数存储在寄存器中而不是堆栈中?

2023-12-07

在 x86-32 汇编中,参数存储在堆栈中,但在 x86-64 中,参数存储在寄存器中。这是什么原因呢?


访问 CPU 寄存器比访问 RAM 快得多。

由于 64 位 CPU 有更多通用寄存器(与 64 位无关,只是因为它们更新/更大),因此使用它们是有意义的。

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

为什么 x86-64 汇编中参数存储在寄存器中而不是堆栈中? 的相关文章

  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

    我在用x86GNU 与 GCC 的程序集 并尝试实现相当于以下内容的程序集c c int x 10 x 0 5 但是 当我尝试运行 使用命令 a out 我的汇编代码如下 第一次编译后gcc filename s 错误Segmentatio
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • “rep stos”x86 汇编指令序列有什么作用?

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

    我一直在尝试使用 NASM 在 Mac OS 和 Windows 上学习 64 位汇编 我的代码是 extern printf section data msg db Hello World 10 0 section text global
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 如何将输入传递到扩展汇编中?

    考虑这段代码 来自我的先前的问题 https stackoverflow com questions 37955538 segfault on movq instruction int main asm movq 100000000 rcx
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • GCC的sqrt()编译后如何工作?使用哪种root方法?牛顿-拉夫森?

    只是对标准感到好奇sqrt 来自 GCC 上的 math h 我自己编码的sqrt 使用牛顿拉夫森来做到这一点 是的 我知道 fsqrt 但CPU是如何做到这一点的呢 我无法调试硬件 现代 CPU 中的典型 div sqrt 硬件使用 2
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw

随机推荐

  • 需要正则表达式模式来将日期与可选时间相匹配

    我需要一个将日期与可选时间相匹配的正则表达式模式 该日期应该是有效的美国日期m d yyyy格式 时间应该是h mm ss am pm或24小时时间hh mm ss 比赛 2011 年 9 月 1 日 2011 年 9 月 1 日上午 10
  • 使用 Laravel 5.8 身份验证和外部 JSON API(创建自己的 ServiceProvider)

    我正在构建一个 Laravel 5 8 应用程序 作为用 Go 编写的外部 API 的前端 我将用户 通行证发布到 API 然后 API 使用 HTTP 200 和 JSON 令牌 JWT 或 HTTP 401 进行响应 以表明凭据无效 我
  • Angular 2 客户端错误

    我刚刚接触 Typescript 和 Angular 2 我想知道哪种方法最适合记录客户端错误 这样如果生产中发生问题 我就能够找出失败的方法以及引发的错误 该应用程序的后端是用 C 编写的 并连接到 SQL Server 数据库 数据通过
  • jQuery 不关闭窗口

    我正在为电子商务网站制作一个表单 供用户请求有关某个项目的 PDF 该表单工作正常并将用户发送到 感谢 页面 在感谢页面上 我让 jQuery 设置了 5 秒后关闭窗口的时间间隔 但它不起作用 在链接中嵌入关闭命令也不起作用 但是 如果 感
  • 将整数列表分配给 @var

    I can declare idOrder int set idOrder 21319 I want declare idOrder int set idOrder 21319 21320 用于 WHERE 子句使用 IN 运算符的一系列语
  • JPackage 只能用于一个应用程序?

    我有一个 java 应用程序 在运行时将生成另一个 JVM 但我想使用 jpackage 打包我的应用程序 它运行得很好 但在运行时 当我的应用程序尝试使用以下命令调用下一个 JVM 时 File javaHome new File Sys
  • 了解投影矩阵

    我试图了解投影向量的值范围是多少 看起来和MSDN说的不符 下面的代码输出一个彩色三角形 三角形完全可见 我期望在投影顶点之后 以下内容将成立 X和Y的范围是 1到1 Z的范围是0到1 我从这里得到这个信息 http msdn micros
  • 如何使用 pymongo 获取仅包含 ObjectId 的列表?

    我有以下代码 client MongoClient data base client hkpr restore agents collection data base agents agent ids agents collection f
  • 如何使用正则表达式提取 4 位数字

    我想提取后面的所有数字company id 部分并存储在变量中 我的字符串如下所示 String company company id 4100 data drm user id 572901936637129135 company id
  • 如何使用Pyarrow实现流式写入效果

    我拥有的数据是一种流数据 我想将它们存储到一个 Parquet 文件中 但是 Pyarrow 每次都会覆盖 Parquet 文件 那么我该怎么办呢 我尝试不关闭编写器 但这似乎是不可能的 因为如果我不关闭它 那么我将无法读取该文件 这是包
  • 访问文件时出错。网络连接可能已丢失

    因此 我使用 VBA 代码打开 Excel 文件 并将数据下载到包含代码的工作表中 它有效 现在我收到错误 访问文件时出错 网络连接可能已丢失 我打开代码看看它落在哪里 我以为文件可能已更改位置或名称已更改 当我浏览代码 使用 F8 时 我
  • 如何序列化java中实现的链表?

    我在网上读到 通过将派生对象声明为瞬态 可以省略派生对象的序列化 但是 在链表的情况下 链接是对象之间的内存引用 那么 我应该将其转换为数组并存储数组表示形式吗 Java 序列化的方式如下LinkedList 它获取所有元素并将它们写入Ob
  • 列表 - 如何查找某个项目出现的次数[重复]

    这个问题在这里已经有答案了 可能的重复 如何计算Python中列表项的出现次数 我正在进行一项民意调查 为此 我正在使用 Python 而我所坚持的部分是试图弄清楚如何计算特定事物 例如 杂货店 出现的次数 例如 民意调查 您最常在哪里看到
  • geohash 和最大距离

    前 6 个字符匹配的两个 geohash 两个 geohash 之间的距离最大为 0 61km 前 5 个字符匹配的两个 geohash 两个 geohash 之间的距离最大为 2 5km 问 5 位长度的给定 geohash 的任何一对边
  • CodeIgniter:解析位于 javascript 中的动态语言标题

    我有一个需要本地化的 JavaScript 代码 即 function js proc var some data this text needs to be translated dynamically at runtime 所以我这样重
  • 设置“可见性”后未获取“RelativeLayout get Height()”

    我想要的是 当我单击仪表板按钮时 它将像滑动抽屉一样打开 打开后再次单击它 它将关闭 我使用这个自定义抽屉是因为 SlidingDrawer 已弃用 现在的问题是 它工作正常 除了第一次单击按钮时 它会打开得非常快 没有任何动画 但会正常关
  • 有没有办法在Python Selenium中通过属性查找元素?

    我得到了这样的 html 片段
  • 使用 WMI 和 C# 的 CPU 使用率

    如何使用 WMI 在 C 中检索当前 CPU 使用情况 我看过很多使用性能计数器的帖子 但我需要一个可以与远程计算机一起使用的解决方案 我还找到了一个VB解决方案here 但如果可能的话 我更愿意在 C 中完成此任务 至少可以说 WMI 的
  • Rust 不接收来自 C++ 的 UDP 消息

    我正在使用 UDP 创建服务器 客户端范例 但 Rust 服务器未接收 C 客户端消息 我已经能够成功地进行 Rust 服务器 Rust 客户端和 C 服务器 Rust 客户端通信 这让我相信我的 C 代码存在问题 或者在将 C 缓冲区发送
  • 为什么 x86-64 汇编中参数存储在寄存器中而不是堆栈中?

    在 x86 32 汇编中 参数存储在堆栈中 但在 x86 64 中 参数存储在寄存器中 这是什么原因呢 访问 CPU 寄存器比访问 RAM 快得多 由于 64 位 CPU 有更多通用寄存器 与 64 位无关 只是因为它们更新 更大 因此使用