问题标签 [fastcall]

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.

0 投票
1 回答
2137 浏览

stack - fastcall:堆栈会发生什么?

我目前正在自己​​学习 x64 汇编,并且在从 c++ 调用汇编过程时无法理解堆栈发生的情况。

根据我目前从MSDNIntel了解到的情况,前 4 个整数/浮点参数存储在 rcx/xmm0、rdx/xmm1、r8/xmm2 和 r9/xmm3 寄存器中,所有其他参数都将放在堆栈中。

我只是不明白为什么我必须从 rsp [rsp+28h] 访问第 5 个参数 40 个字节而不是 8 个,因为前 32 个字节是在寄存器中访问的。

有人可以解释一下实际发生的事情吗?

谢谢你。

0 投票
1 回答
274 浏览

c++ - fastcall如何使用超过4个参数

我试图在 assebmly(FASM) 中构建一个使用超过 4 个参数的函数。在 x86 中它工作正常,但我知道在 x64 中使用 fastcall 你必须按照 rcx、rdx、r8、r9 的顺序将参数溢出到阴影空间中,我读到 5 等你必须将它们传递到堆栈中,但是我不知道该怎么做。这是我尝试过的,但它一直说无效的操作数。我知道我做的前 4 个参数是正确的,因为我之前做过 x64 函数,但它是最后 3 个我不知道如何溢出

如果我尝试

它在行上说多余的字符。我还看到有人使用 rsp+20h、rsp+28h 等,但这也不起作用。如何在 x64 上使用 fastcall 调用超过 4 个参数?我还必须在堆栈上腾出空间吗?我看到有些人必须在他们的溢出代码之前加上 add rsp,20h 。我试过了,但它对 invlaid 操作数没有帮助。谢谢

更新

在玩了一会儿之后,我发现它似乎工作的唯一方法是如果我溢出前 4 个参数,然后忽略其余的 5-infinity

0 投票
1 回答
252 浏览

gcc - Windows 中的 Fastcall 名称修饰不容易移植

我在 Windows 中使用 mingw 编译 C 和汇编代码,其中几个函数具有 fastcall 调用约定(如 Microsoft 定义的那样)。如果我在声明中使用 __fastcall,mingw 会执行 Windows 所做的操作并进行 name 装饰:

名称前有一个 at 符号 (@);参数列表中后跟字节数(十进制)的 at 符号后缀为名称

这工作正常。我有以下形式的装配标签:

但是当我移植到 Linux(x86,32 位)时,这被证明是一个大问题。Gcc 突然不喜欢 __fastcall (或 __cdecl )并且根本不喜欢标签中的@。我不确定如何统一这两个问题——要么让 Linux 中的 gcc 喜欢 @,要么让 Windows 中的 mingw 不添加 @。

另外:我可以使用__attribute__(__cdecl__)代替,__cdecl但我对它的去向感到困惑。我假设在函数名本身之前,但我看到人们把它放在声明之后和分号之前。我也可以吗?

0 投票
2 回答
444 浏览

visual-studio - 寻址变量(或者,ML64 生成什么?)

我有一个为 X64 编写的 ASM 文件。它提供了一个叶子函数。该文件由 MASM64/ML64 组装而成。

带有签名的 C-pseduo 代码是:

这是 ASM 代码的相同部分:

当我进行呼叫时,它似乎fastcall正在被使用,这与文档一致。前两个参数出现在RCXandRDX中,这也是一致的。

但是带有NULL指针的测试用例会产生意想不到的结果。这是正在使用的测试用例:

当我执行代码时,RCX似乎是buffer(its NULL),RDX似乎是bsize(its 0x40),但比较cmp buffer, 0是针对我未知的值进行的。从即时窗口:

13f82bcd0看起来大致像一个指令指针地址(EIP 是13F50D268)。它似乎与ESPor不相似EBP

我有几个问题...

  • ML64 对变量使用什么寻址模式buffer
  • 变量的值buffer从何而来?
  • 为什么ML64 使用ECX变量buffer
  • 我怎样才能解决这个问题?

相同的代码,缩短为 32 位,可以很好地汇编和执行。但是,ML 将buffer和放入bsize堆栈并相对于EBP.

我也尝试更改为cmp QWORD PTR buffer, 0,但没有帮助。


在此处输入图像描述

0 投票
0 回答
863 浏览

gcc - x86 gcc 编译的汇编代码:fastcall 行为

我正在处理一些x86汇编程序分析任务,并试图找出快速调用行为。

虽然在32-bit x86平台上,堆栈被定义为在调用转换中传递函数参数。但是,我观察到许多函数调用确实利用了两个寄存器,eaxedx传递了前两个函数参数。

例如,这是一个(简化的)示例,位于libgcrypt 1.6.1

如您所见,注册eaxedx用于传递参数。我的观察是这两个寄存器总是用来传递前两个参数。

请注意,我正在使用它gcc来编译代码。但是,我只能找到编译器的fastcall定义Microsoft,它使用寄存器ecx(不是eax!)edx传递参数。

gcc所以这是我的问题:这种优化有什么明确的定义吗?我只是找不到一些信息来源......

0 投票
1 回答
116 浏览

windows - 快速调用函数崩溃

尝试使用我的程序中的 fastcall 约定调用进程函数,但每次尝试时都会崩溃。已经花了这么多时间,但无法解决这个问题......请需要一些帮助......这是所有需要的信息和我的尝试:

在此处输入图像描述

图为函数的程序运行时断点后的指令上下文...

这是我的代码源:

提前致谢 :) ...

0 投票
0 回答
345 浏览

node.js - 使用 fastcall 访问 c++ 库的问题。(javascript、nodejs、外函数接口)

我尝试使用 fastcall,这是我第一次使用 fastcall 和外部函数接口,我尝试加载 datatable.dll 它抛出错误,尝试传递所有可能的库路径(绝对和相对)。使用 nodejs、fastcall、javascipt

我收到的错误是

0 投票
1 回答
47 浏览

c - 将 C 中的函数调用到程序集

如果我们有以下功能:

对 in 函数的调用Assembly将是这样的:

这个对吗?为什么是这个顺序?是因为每种类型的大小吗?