gpt4 book ai didi

ios - stdargs [va_start()、va_arg() 等] 在 arm64 上损坏了吗?

转载 作者:可可西里 更新时间:2023-11-01 05:41:15 24 4
gpt4 key购买 nike

我有一个以标准方式使用可变参数的 c 函数,下面是一个简化的示例:

    void func(parameter,...) {
va_list args;
va_start(args, parameter);

//process args
v1 = va_arg(args,sometype);
v2 = va_arg(args,sometype);
...
vn = va_arg(args,sometype);

va_end(args);
}


//call func

func(parameter, p1, p2, ..., pn);

在所有设备 armv7s 和更低版本以及包括 64 位模拟器在内的所有模拟器上,这成功并且变量 v1 到 vn 被分配给 p1 到 pn,但是当这在 arm64 上执行时,可变参数列表似乎是倒退的( v1 = pn , v2 = pn-1, ..., vn = p1)

有什么办法可以解决这个问题吗?还是我错过了描述此更改的文档?

谢谢

编辑:

我没有提到这个问题的一个关键要素,我以前没想过要提到。我试图用通用可变参数函数调配非可变参数函数。

注意:使用的编译器是 Apple LLVM 5.0

最佳答案

我怀疑这是因为改变了参数传递给函数的方式。

有三种方法可以做到这一点:在寄存器中在堆栈中以及两者的结合,这取决于参数的数量和类型 em>。似乎 ARMv6、ARMv7 和 ARM64 架构在 ABI 遵循的约定方面有所不同。

无论实际约定如何,编译器都应该透明地处理这个问题,因此如果它的行为不符合标准,您可能需要考虑更新您的工具链(您没有在问题中提及编译器,但这是关键).

Apple's documentation了解不同架构版本的不同调用约定可能有助于追踪编译器未考虑的任何更改。

有关 ARM 如何传递参数的更多信息,请参阅 Procedure Call Standard for the ARM architecture(ARMv6, ARMv7 的第 5.5 节和 section 5.4 in the 64 bit version of the ABI

关于ios - stdargs [va_start()、va_arg() 等] 在 arm64 上损坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20621627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com