问题标签 [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.
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
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
但我对它的去向感到困惑。我假设在函数名本身之前,但我看到人们把它放在声明之后和分号之前。我也可以吗?
visual-studio - 寻址变量(或者,ML64 生成什么?)
我有一个为 X64 编写的 ASM 文件。它提供了一个叶子函数。该文件由 MASM64/ML64 组装而成。
带有签名的 C-pseduo 代码是:
这是 ASM 代码的相同部分:
当我进行呼叫时,它似乎fastcall
正在被使用,这与文档一致。前两个参数出现在RCX
andRDX
中,这也是一致的。
但是带有NULL
指针的测试用例会产生意想不到的结果。这是正在使用的测试用例:
当我执行代码时,RCX
似乎是buffer
(its NULL
),RDX
似乎是bsize
(its 0x40
),但比较cmp buffer, 0
是针对我未知的值进行的。从即时窗口:
13f82bcd0
看起来大致像一个指令指针地址(EIP 是13F50D268
)。它似乎与ESP
or不相似EBP
。
我有几个问题...
- ML64 对变量使用什么寻址模式
buffer
? - 变量的值
buffer
从何而来? - 为什么
ML64
不使用ECX
变量buffer
? - 我怎样才能解决这个问题?
相同的代码,缩短为 32 位,可以很好地汇编和执行。但是,ML 将buffer
和放入bsize
堆栈并相对于EBP
.
我也尝试更改为cmp QWORD PTR buffer, 0
,但没有帮助。
gcc - x86 gcc 编译的汇编代码:fastcall 行为
我正在处理一些x86
汇编程序分析任务,并试图找出快速调用行为。
虽然在32-bit x86
平台上,堆栈被定义为在调用转换中传递函数参数。但是,我观察到许多函数调用确实利用了两个寄存器,eax
并edx
传递了前两个函数参数。
例如,这是一个(简化的)示例,位于libgcrypt 1.6.1
:
如您所见,注册eax
并edx
用于传递参数。我的观察是这两个寄存器总是用来传递前两个参数。
请注意,我正在使用它gcc
来编译代码。但是,我只能找到编译器的fastcall
定义Microsoft
,它使用寄存器ecx
(不是eax
!)并edx
传递参数。
gcc
所以这是我的问题:这种优化有什么明确的定义吗?我只是找不到一些信息来源......
node.js - 使用 fastcall 访问 c++ 库的问题。(javascript、nodejs、外函数接口)
我尝试使用 fastcall,这是我第一次使用 fastcall 和外部函数接口,我尝试加载 datatable.dll 它抛出错误,尝试传递所有可能的库路径(绝对和相对)。使用 nodejs、fastcall、javascipt
我收到的错误是
c - 将 C 中的函数调用到程序集
如果我们有以下功能:
对 in 函数的调用Assembly
将是这样的:
这个对吗?为什么是这个顺序?是因为每种类型的大小吗?