问题标签 [calling-convention]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 非托管函数挂钩,调用约定的堆栈/注册问题?
这不是关于 EasyHook 的特定功能,而是关于挂钩的一般功能。我想用这个签名挂钩一个函数:
这显然是非托管代码,我正在尝试使用 EasyHook 将它与我的托管 c# 代码挂钩。但我认为这不是 EasyHook 造成的问题,而是我对调用约定等的了解......
这就是我定义 DllImport 和删除的方式:
但是一旦我注入钩子,钩子程序就会继续崩溃 - 不足为奇。我认为这是调用约定的问题,并且我的钩子函数以某种方式干扰了钩子程序的堆栈。
因此,我查看了另一个项目,该项目确实挂钩了相同的功能,但在 c++ 中绕道(挂钩部分):
和被调用的函数:
(目标程序集和 c++ 示例都是用 Visual c++ 编译的)。我想在调用原始函数之前我必须保存一些寄存器并修复堆栈?或者任何其他想法我在这里做错了什么?
c - 参数传递如何工作?
我想知道如何将参数传递给 C 中的函数。值存储在哪里以及如何检索它们?可变参数传递如何工作?也因为它是相关的:返回值呢?
我对 CPU 寄存器和汇编器有基本的了解,但还不足以让我彻底了解 GCC 向我吐口水的 ASM。一些简单的带注释的例子将不胜感激。
assembly - 帧指针、epb 和返回地址
下图来自调用堆栈上的维基百科条目,有些我不完全理解:
我认为存储在 ebp 寄存器中的帧指针在 prologue* 中是这样初始化的:
如果是这样,那么图像中的帧指针不应该指向返回地址之后,它应该是前一个帧指针地址,然后是返回地址吗?我错过了什么?
谢谢!
windows - 为什么 Windows64 使用与 x86-64 上的所有其他操作系统不同的调用约定?
AMD 有一个 ABI 规范,描述了在 x86-64 上使用的调用约定。所有操作系统都遵循它,除了具有自己的 x86-64 调用约定的 Windows。为什么?
有谁知道这种差异的技术、历史或政治原因,还是纯粹是 NIH 综合症的问题?
我知道不同的操作系统可能对更高级别的东西有不同的需求,但这并不能解释为什么例如 Windows 上的寄存器参数传递顺序是rcx - rdx - r8 - r9 - rest on stack
其他人都使用rdi - rsi - rdx - rcx - r8 - r9 - rest on stack
.
PS 我知道这些调用约定通常有何不同,并且如果需要,我知道在哪里可以找到详细信息。我想知道为什么。
编辑:关于如何,参见例如维基百科条目和那里的链接。
c++ - 使用 thiscall 约定调用 C++ 成员函数
我有一个用 C++ 编写的应用程序,它加载我用 Delphi 编写的 DLL。应用程序调用 DLL 的导出函数并将指针传递给一个类的对象,该类具有我想从我的 Delphi DLL 调用的几个成员函数。我编写了一个与 C++ 类等效的 Delphi 类:
和 C++ 类看起来一样
成员函数使用没有 Delphi 等效的 thiscall 调用约定。这可能意味着我需要使用汇编。我试过了:
但是当应用程序调用此函数时出现分段错误。如何正确调用成员函数?
winapi - 在 NASM (stdcall) 中调用 LONGLONG RtlLargeIntegerDivide(LONGLONG, LONGLONG, LONGLONG*)
我正在尝试调用以下函数:
在汇编代码(NASM)中。它使用 stdcall 调用约定,并返回商。这些是规格:
输入:[EDX,EAX](除数),[ECX,EBX](除数)
输出:[EDX,EAX](商),[ECX,EBX](余数)
我该怎么做呢?(我的主要问题是不完全理解 EBP 和 ESP,以及它们与局部变量的关系。)
(不,这不是家庭作业;我正在尝试实现一个包装 C 运行时库。)
谢谢!
c - 为什么 gcc 使用 movl 而不是 push 来传递函数 args?
注意这段代码:
之后 :
该命令在汇编中显示我们的源代码。
现在我们可以看到在 main 函数中,我们从不使用“push”命令将 a 函数的参数压入堆栈。它使用“movel”而不是那个
为什么会这样?他们之间有什么区别?
c++ - MS Visual C++:什么时候应该关心使用调用约定?
在 C/C++ 中(具体来说,我使用的是 MSVS),在什么情况下需要担心为函数定义指定调用约定?它们曾经很重要吗?是否有必要在必要时选择最佳约定(即快速调用等)。
也许我的理解不足,但我只是不知道他们什么时候会是程序员需要关心诸如参数放在堆栈上的顺序之类的事情。我也不明白为什么编译器的优化无法选择最适合该特定功能的方案。任何人都可以提供给我的任何知识都会很棒。谢谢!
scala - Scala可以通过引用调用吗?
我知道 Scala 支持 ALGOL 的按名称调用,我想我理解这意味着什么,但是 Scala 可以像 C#、VB.NET 和 C++ 那样做按引用调用吗?我知道 Java 不能进行引用调用,但我不确定这种限制是完全由于语言还是 JVM 造成的。
当您想将庞大的数据结构传递给方法但又不想复制它时,这将很有用。在这种情况下,引用调用似乎很完美。