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

在x64中,被调用方如何知道要弹出多少个参数以及按哪个顺序弹出?

在x64中,被调用方如何知道要弹出多少个参数以及按哪个顺序弹出,取决于所使用的调用约定。调用约定是一种规定了函数参数传递方式和寄存器使用规则的约定。

在x64架构中,常用的调用约定有以下几种:

  1. Microsoft x64调用约定(Microsoft x64 Calling Convention):
    • 参数传递顺序:从右往左依次入栈,前四个参数使用寄存器传递。
    • 参数个数:前四个参数使用寄存器传递,其余参数通过栈传递。
    • 寄存器使用:前四个整型或指针参数使用RCX、RDX、R8和R9寄存器传递,浮点参数使用XMM0、XMM1、XMM2和XMM3寄存器传递。
  • System V AMD64调用约定(System V AMD64 ABI):
    • 参数传递顺序:从左往右依次入栈,前六个参数使用寄存器传递。
    • 参数个数:前六个参数使用寄存器传递,其余参数通过栈传递。
    • 寄存器使用:前六个整型或指针参数使用RDI、RSI、RDX、RCX、R8和R9寄存器传递,浮点参数使用XMM0、XMM1、XMM2和XMM3寄存器传递。

被调用方在编写函数时,需要按照调用约定的规则来获取参数。对于使用寄存器传递的参数,可以直接从对应的寄存器中获取;对于通过栈传递的参数,可以通过栈指针和偏移量来获取。

需要注意的是,调用方和被调用方在使用相同的调用约定时才能正确地传递参数。否则,参数传递的方式和寄存器使用规则可能会不一致,导致函数调用出错。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(云原生 Serverless 服务):https://cloud.tencent.com/product/scf
  • 腾讯云云服务器(云上服务器运维):https://cloud.tencent.com/product/cvm
  • 腾讯云数据库(云数据库服务):https://cloud.tencent.com/product/cdb
  • 腾讯云音视频处理(云端音视频处理服务):https://cloud.tencent.com/product/mps
  • 腾讯云人工智能(AI 服务):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(物联网平台):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动应用开发服务):https://cloud.tencent.com/product/mad
  • 腾讯云对象存储(云存储服务):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(区块链服务):https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙(云游戏服务):https://cloud.tencent.com/product/gs
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

关于“Python”的核心知识点整理大全5

别忘了,每当你使用pop()时,弹出的元素就不再在列表中了。...根据值删除元素 有时候,你不知道要从列表删除的值所处的位 置。如果你只知道删除的元素的值,可使 用方法remove()。 例如,假设我们要从列表motorcycles删除值'ducati'。...函数 sorted()让你能够特定顺序显示列表元素,同时不影响它们列表的原始排列顺序。 下面尝试对汽车列表调用这个函数。...如果你要按与字母顺 序相反的顺序显示列表,也可向函数sorted()传递参数reverse=True。 注意 并非所有的值都是小写时,字母顺序排列列表复杂些。...3.5 小结 本章,你学习了:列表是什么以及如何使用其中的元素;如何定义列表以及如何增删元 素;如何对列表进行永久性排序,以及如何为展示列表而进行临时排序;如何确定列表的长度, 以及使用列表时如何避免索引错误

11810

抛弃V8参数适配器框架!JavaScript调用提速40%的实践

移除参数适配器框架之前和之后的典型 JavaScript 栈框架。 加快 JavaScript 调用 为了讲清楚我们如何加快调用,首先我们来看看 V8 如何执行一个调用以及参数适配器框架如何工作。...此时,我们不知道调用者是否是可调用对象,也不知道调用者期望多少个参数,也就是它的形式参数数量。 ? 内置 InterpreterPushArgsThenCall 执行后的框架状态。...调用者框架参数 假设我们将参数放在被调用者框架。这似乎是一个好主意,因为无论何时弹出框架,我们都会一次弹出所有参数参数必须位于保存的框架指针和框架末尾之间的某个位置。...我们不需要知道栈中有多少个参数,但如果我们可以保证栈至少有形参计数那么多的参数,那么我们就能一直使用这种方案来计算偏移量。...最后,我们通过一个寄存器将参数数量传递给调用者的 Code。 x64 的情况下,我们使用寄存器 rax。

36310

java虚拟机栈-由StackOverFlowError引起的思考

StackOverflowError这个错误常出现在较深的方法调用以及递归方法,平时很少会遇到。我们以一道经典的递归算法题为例,求1到n的和。...虚拟机栈的最小值虚拟机启动时解析完全局参数之后调用os::init_2法设置。虚拟机栈的最小值受当前系统是32位还是64位的影响,也受系统页大小影响。...使用汇编指令编写代码,我们需要考虑CPU的架构,有多少个寄存器可选,了解硬件,需要关心每条指令操作多少个字节,使用寄存器之前需要考虑是否备份寄存器的当前值,指令执行完之后是否需要恢复寄存器的值。...而使用依赖栈工作的字节码指令编写代码,我们只需要关心每条字节码指令需要多少个参数顺序参数push到操作数栈顶。如果指令执行完有返回值,操作数栈顶就是返回值。...总结 本文我们从栈溢出的例子出发,了解了栈与线程的关系、栈与栈桢的关系,同时也介绍多线程项目中如何通过配置-Xss参数调优,降低进程占用的内存,以及如何通过NAT工具查看进程使用的内存情况。

1.2K20

C语言函数调用约定

是从左到右入栈还是从右到左入栈; [参数弹出方式]:函数调用后,由谁来把栈恢复原状? 函数调用结束后需要将压入栈参数全部弹出,以使得栈函数调用前后保持一致。...这个弹出的工作可以由调用来完成,也可以由调用来完成。 [函数名修饰方式]:函数名在编译时会被修改,调用惯例可以决定如何修改函数名。...调用(callee) @+function+@+参数的字节数 pascal 从左到右的顺序入栈 调用(callee) \ 调用约定 参数传递方式 参数出栈方式...x64平台,还有一些扩展… 一个函数调用时,前四个参数是从左至右依次存放于RCX、RDX、R8、R9寄存器里面,剩下的参数从右至左顺序入栈;栈的增长方向为从高地址到低地址。...; 调用者负责栈平衡; 调用函数的返回值是整数时,则返回值会被存放于RAX;浮点数返回xmm0 RAX,RCX,RDX,R8,R9,R10,R11是“易挥发”的,不用特别保护(所谓保护就是使用前

12710

Android面试官:这几个问题都回答不出来你真的懂Activity的启动模式吗?

2,此时下home键返回主屏幕,然后重新点击图标启动这个应用,我们会发现弹出的界面还是 D 而不是界面 A。...了解完任务之后,我们就大概知道了上述几个例子Android系统如何保存Activity使用状态的规则。...所以Android系统显示界面的顺序是先找到显示界面所在的任务,然后在对应的返回栈中找到显示的Activity。...用户“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 销毁),而前一个 Activity 恢复执行。...如果用户继续“返回”,堆栈的相应 Activity 就会弹出,以显示前一个 Activity,直到用户返回主屏幕为止(或者,返回任务开始时正在运行的任意 Activity)。

1K00

你真的了解Activity的启动模式吗?

此时下home键返回主屏幕,然后重新点击图标启动这个应用,我们会发现弹出的界面还是 D 而不是界面 A。...了解完任务之后,我们就大概知道了上述几个例子Android系统如何保存Activity使用状态的规则。...所以Android系统显示界面的顺序是先找到显示界面所在的任务,然后在对应的返回栈中找到显示的Activity。...用户“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 销毁),而前一个 Activity 恢复执行。...当所有 Activity 均从堆栈移除后,任务即不复存在。栈也就会被回收掉。 特殊的任务 通过前面的了解,我们知道如果打开新的界面需要把Activity实例放到当前任务对应的返回栈的栈顶。

57340

你了解 Python 字节码的原理吗?

Python 是如何工作的 Python 通常被描述为一种解释语言,在这种语言中,你的源代码程序运行时翻译成 CPU 指令,但这只是说对了部分。...每次函数调用都会将新的帧推到调用堆栈上,每次函数调用返回时,它的帧都会弹出 2.每一帧,都有一个评估堆栈(也称为数据堆栈)。...,它表示 Python 需要在堆栈顶部弹出两个位置参数; 然后函数将在它上面进行调用,并且它也同时弹出(关键字参数的函数,使用指令-CALL_FUNCTION_KW-类似的操作,并配合使用第三条指令CALL_FUNCTION_EX...一旦运行完成,帧将从调用堆栈中弹出原始帧,my_function 的返回值将被推入到计算栈的顶部。 我们知道了这个东西了,也知道字节码了文件了,但是如何去使用字节码呢?...然后让我们看看这个过程: 由于 Python 解释器是基于栈的,所以前几步是用 LOAD_CONST 将常量正确顺序放入到栈,然后使用 BUILD_MAP 弹出增加到字典的新键和值。

2.4K40

做完这套面试题,你才敢说懂Excel

最终结果如下图: 实际工作,我们遇到的排序要求,可能不只是单纯的“降序”或“升序”,而是希望指定的顺序来排列。...;“次序”选择“自定义序列”,因为我们希望产品线的值能我们自定义的顺序来排列。...Mid函数语法为: =mid(进行文本提取的文本,从第几位字符开始提取,提取多少个字符) 因为我们已经利用find函数找到了“付”字所在的文本位置,所以,我们就从其所在位置-1处开始进行提取,提取多少个字符呢...最终结果如下图: 实际工作,我们遇到的排序要求,可能不只是单纯的“降序”或“升序”,而是希望指定的顺序来排列。...;“次序”选择“自定义序列”,因为我们希望产品线的值能我们自定义的顺序来排列。

4.5K00

变量、简单数据类型、列表

你可以根据位置或值来删除列表的元素。(1).使用del语句删除元素如果知道删除的元素列表的位置,可使用del语句。...(3).弹出列表任何位置处的元素实际上,你可以使用pop( )来删除列表任何位置的元素,只需括号中指定要删除的元素的索引即可。...还可以字母顺序相反的顺序排列元素,为此,只需向sort( )方法传递参数reverse =Ture。...sorted( )函数让你能够特定顺序显示列表元素,同时不影响它们列表的原始排列顺序。...倒着打印列表:反转列表元素的排列顺序,可使用reverse( )。注意,reverse( )不是与字母顺序相反的顺序排列元素,而只是反转列表元素的排列顺序

1.5K20

01- JavaScript 调用堆栈

本文旨在说明什么是调用堆栈以及为什么需要调用栈?对调用栈的理解有助于我们更加清晰的知道 函数的的层次结构和执行顺序 JavaScript 的引擎工作方式。...异步 JavaScript ,我们有一个回调函数,一个事件循环队列和一个任务执行队列。事件循环将回调函数 推到堆栈之后,回调函数将在执行期间由调用堆栈执行。...让我们打破之前的定义: LIFO:当我们说调用堆栈是按照后进先出的数据结构原理进行操作时,这意味着当函数返回时,压入堆栈的最后一个函数是第一个弹出的函数。...临时存储 调用一个函数时,该函数,其参数和变量将被推入调用堆栈以形成堆栈框架,该堆栈是堆栈的内存位置。当函数返回时(从栈弹出),将清除内存。 ? ?...管理功能调用 调用堆栈回鹘每一个堆栈帧位置的记录。它知道下一个执行的功能,并在执行后将其删除,这就是使得 JavaScript 的代码执行顺序同步的原因。 调用堆栈如何处理函数调用

1.3K20

MFC 键盘钩子「建议收藏」

光想不做可不行,开始行动(您可千万别急着去拿工具箱啊^_^)… 按键能发音,其关键就是让程序能够知道当前键盘上是哪个下,并播放相应的声音,自己的程序当然不在话下,那么其它程序当前哪个如何得知呢...下载本文的全部源代码 大小:552K 二、挂钩(HOOK)的基本原理 WINDOWS调用挂接的回调函数时首先会调用位于函数链首的函数,我们只要将自己的回调函数置于链首,该回调函数就会首先调用。...,因为我们只用到键盘操作所以设定为WH_KEYBOARD;第二个参数将钩子函数的入口地址指定为KeyboardProc,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起KeyboardProc...的动作;第三个参数是钩子函数所在模块的句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息; 现在,就开始定义当键盘上的键下时程序要做什么了~ KeyboardProc...程序如何调用DLL呢?那就简单了.再用VC++6.0新建一个MFC AppWizard(exe)工程,命名为KeySound,点击”确定”后选择程序类型为对话框,直接点击确定即可.

1.2K20

安卓 topic-菜单 Menu

如果您的 Activity 和片段均为选项菜单声明项目,则这些项目将合并到 UI 。 系统将首先显示 Activity 的项目,随后每个片段添加到 Activity 顺序显示各片段的项目。... Android 2.3.x 及更低版本,每当用户打开选项菜单时(“菜单”按钮),系统均会调用 onPrepareOptionsMenu()。...通过未处理的情况下调用超类,系统会将事件逐一传递给每个片段相应的回调方法(按照每个片段的添加顺序),直到返回 true 或 false 为止。...应用如何调用上下文操作模式以及如何定义每个操作的行为,具体取决于您的设计。 设计基本上分为两种: 针对单个任意视图的上下文操作。...另请注意,操作模式销毁时,上述示例会将 mActionMode 变量设置为 null。 在下一步,您将了解如何初始化该变量,以及保存 Activity 或片段的成员变量有何作用。

2.6K20

汇编和栈

# 堆栈相关的操作码 到目前为止,您已经了解了调用约定以及内存的布局方式,但是还没有真正探究许多操作码 x64 汇编的实际作用。 现在是时候更详细地介绍几种与堆栈相关的操作码了。...然后,控制会在 awakeFromNib 恢复, 哇! 那很有趣! 一个简单的功能,但是它说明了堆栈如何通过调用,推入,弹出和退出指令工作。...# 栈和 7 个以上的参数 如第 10 章所述,x86_64 的调用规则将顺序使用以下寄存器作为函数参数:RDI,RSI,RDX,RCX,R8,R9。...现在,您将再次使用它,以了解如何参数 7 及其以后的参数传递给该函数。...这可能是需要在其中写入该值以及何处使用它的另一条指令。 这就是为什么调试版本比发行版本慢得多的原因。 # 栈的探索 不用担心 本章即将完成。 但是,堆栈探索应该记住一些非常重要的要点。

3.3K20

7道题,测测你的职场技能

单击左表任意一单元格,Ctrl+A,全选整个单元格区域;然后,快捷键F5,弹出【定位】对话框; 点击左下角的“定位条件”按钮,弹出的【定位条件】窗格,可以对自己进行定位的条件进行选择。...输入所需要的数据,如案例输入的是“未知”;输入结束时,Ctrl+Enter组合键确认输入,此时,就会在选定的所有空白单元格里批量输入了相同的内容。...如何实现呢?我们可以通过添加辅助列的方法来实现。首先,姓名列的左侧增加一列“辅助列”,输入1,然后填充序列,如案例填充到5。...例如,要在表格查找含有“北”字的,“北”字前面还有多少个字符,后面有多少个字符,这些都是不确定的,所以,我们可以以“*北*”来指代含有“北”字的任意字符串。...从上面案例我们知道excel里,*可以代替任意多个字符,所以,包含“车间”二字的字符串可以写为“*车间*”。 因此,最终的公式: =countif(A3:A9,"*车间*") 返回的结果为4。

3.6K11

Python字节码介绍

但是,除了“哦,这就是Python字节码”,你真的知道这些文件的内容以及Python如何使用它们吗? 如果回答是"否",那么今天就是你的幸运日!...Python如何工作 Python经常被称为是一种解释型语言 -- 一种源代码程序运行时即时翻译成原生CPU指令的语言 - 但这只说对了一部分。...2,表示Python需要从栈顶部弹出两个位置参数; 那么调用的函数将位于最前面,并且它也可以弹出(对于涉及关键字参数的函数,会使用不同的指令 -- CALL_FUNCTION_KW - - 但操作原理类似...dis模块的文档涵盖了相关内容,并提供了字节码指令以及它们的作用和参数的完整清单。 例如,获取之前hello()函数的字节码列表,我将它键入Python解释器,然后运行: ?...1:告诉Python调用一个函数; 它需要从堆栈中弹出一个位置参数,然后新的堆栈顶部将是调用的函数。

1.5K30

做完这套面试题,你才敢说懂Excel

问题2:“产品线”进行升序排列 题目要求对“产品线”进行升序排列,首先选定“产品线”列,然后【排序和筛选】-【升序】,弹出的“排序提醒”窗口里,选择【扩展选定区域】。...最终结果如下图: 实际工作,我们遇到的排序要求,可能不只是单纯的“降序”或“升序”,而是希望指定的顺序来排列。...;“次序”选择“自定义序列”,因为我们希望产品线的值能我们自定义的顺序来排列。...即高小明成员列,是第4个。 用match匹配出位置信息后,我们再嵌套index引用函数,将match匹配出来的位置信息作为index的第二个参数传回给index。...Mid函数语法为: =mid(进行文本提取的文本,从第几位字符开始提取,提取多少个字符) 因为我们已经利用find函数找到了“付”字所在的文本位置,所以,我们就从其所在位置-1处开始进行提取,提取多少个字符呢

2.2K10

什么是java的多态

比方说下 F1 键这个动作,如果当前 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前 Word 下弹出的就是 Word 帮助; Windows 下弹出的就是 Windows 帮助和支持...运行时多态是父类引用指向子类对象时产生的。一个父类的引用可以指向多种子类对象,那么运行时对于同一个消息应该如何做出响应呢?这就由实际的引用的对象的类型来决定。 b. 为什么要有重写呢?...理解这是为什么,我们先理解下面这句话: 当超类对象引用变量引用子类对象时,引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个调用的方法必须是超类定义过的,也就是说被子类覆盖的方法...它说:当超类对象引用变量引用子类对象时,引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个调用的方法必须是超类定义过的,也就是说被子类覆盖的方法。...B类是没有对A的show方法进行重写,所以当a.show()时调用的是父类的show方法,父类show方法调用了show2法,但是调用的时候发现show2法已经被子类重写,因此会调用子类

51120

动图学JS异步: Promises & AsyncAwait

以及它是如何解决上述问题的。...Microtasks and (Macro)tasks 现在我们知道如果去创建一个promise、以及如果提取promise的值,那么接下来我们继续添加一些代码示例,然后运行它。 ?...然后事件循环会去检查microtasks中排队的队列,然后按照顺序依次将microtasks任务出队,弹入到调用堆栈,执行,弹出,直到清空microtasks。...于是它被弹出调用堆栈后,由于它会记录promise之前resolve()的值,因此打印出Promise!控制台并且从调用堆栈弹出。 ?...函数体的第一行,我们调用另一个的console.log,console.log添加到调用堆栈,执行它,并且返回值In function!打印到控制台,并从调用堆栈弹出。 ?

1.1K20

【Redis02】Redis基础:List相关操作

LPUSH 从左边添加,1最先添加进去,然后是 2 ,因此,返回的顺序是 3 2 1 这样的。...除了指定显示第几个之外,我们还可以指定返回多少个,使用 COUNT 参数。...弹出 弹出操作是实现栈或者队列的重要命令,也是大家会经常使用的两个命令,分别是 RPOP 和 LPOP ,很明显,就是分别从右、左弹出数据。弹出的意思就是返回这条数据并且 List 删除它。...删除指定下标元素 Redis 没有提供指定下标删除 List 数据的命令,那要实现删除指定下标的元素怎么弄呢?...说实话,之前我还真不知道 LMOVE 和 BLPOP 这一类的东西,既然知道了,那么下回做队列的时候咱也可以试试了。

31430
领券