我正在查看x86-64ABIFigure 3.31 ,并对和中的示例有疑问Figure 3.32:
int a, b;
long double ld;
double m, n;
__m256 u, y;
__m512 v, z;
extern void func (int a, double m, __m256 u, __m512 v, ...);
func (a, m, u, v, b, ld, y, z, n);
Run Code Online (Sandbox Code Playgroud)
据说当向func函数传递参数时%rax包含 3 个,但我只能看到寄存器中传递了 2 个浮点值:ld和m。所以我实现了以下示例:
impl.c:
#include <immintrin.h>
unsigned long func(int a, double m, __m256 u, __m512 v, ...){
unsigned long rax;
__asm__ __volatile__(
"" …Run Code Online (Sandbox Code Playgroud) 我正在尝试在汇编(64 位)中实现一个符号函数,然后从 C 调用它。
我的函数接受一个参数:一个无符号 int 并返回一个 int,它可以是 -1(如果参数为负)、0 (如果参数为 0)和 1(如果参数为正)。
我的程序可以很好地检测正数和零,但如果我传递一个负数作为参数,那么它会将其作为正数处理并返回 1。
主要.c:
#include <stdio.h>
extern int sign(signed int);
int main()
{
signed int num;
scanf("%d",&num);
printf("num: %d sign: %d\n",num,sign(num));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
符号.asm:
#include <stdio.h>
extern int sign(signed int);
int main()
{
signed int num;
scanf("%d",&num);
printf("num: %d sign: %d\n",num,sign(num));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
起初我以为问题出在汇编代码中,所以我将测试的寄存器的值设置为正数,然后是负数,最后为零。效果很好。它也识别负数。
在那之后,我现在认为问题在于参数的传递。我认为参数的符号在某个地方丢失了,或者存储负数的 C 方式与汇编不兼容?
我将不胜感激任何帮助。先感谢您!
有没有办法以编程方式检索ARM处理器版本?我正在尝试将其发送到Google Analytics.有人告诉我这是在/ proc/cpuinfo中文件夹,但我不能确定如何检索代码信息.
谢谢,安德鲁
我的阅读std::unique_ptr使我确信它(以及其他智能指针)绝对是项目内部指针的最佳选择(特别是在优化编译器可以从std :: unique_ptr中删除所有运行时成本之后?),但我是还不确定在界面上做什么.我不完全了解各种C++ ABI是如何工作的,所以如果这是一个愚蠢的问题请耐心等待,但是可以使用或返回指针,具有指针成员的类/结构等的函数被替换为使用的东西unique_ptr(也许使用unique_ptrrefs?)而不需要重新编译?C代码可以在unique_ptr没有复杂的情况下与C++接口交互吗?
我正在编写一组充当接口的纯虚拟类。这个想法是,实现此类接口的代码可以使用不同的构建配置、编译器,甚至不同的 STL 实现来构建,以通过此类接口使用此类对象。
像和一样的普通旧数据uint32_t是标准化的。(不是因为标准没有说明它的大小。)doublefloatbool
属于哪个类别std::size_t?它纯粹是机器架构的功能吗?例如,在 32 位机器上,它可能sizeof(std::size_t)不是 4?
X32允许用户使用在x86_64处理器上运行的32位整数,长整数和指针来编写程序.在某些使用案例中,使用X32有许多好处.(X32与X86或X64 不同 ; 有关详细信息,请参阅x86,x32和x64体系结构之间的差异).
一些Windows Enterprise Server似乎支持X32,但我无法找到更多信息.这是基于一些英特尔PDF,如基于英特尔®至强®处理器E5-2400系列的智能系统平台:
微软关于预定义宏的文档列出了常见的嫌疑,比如_M_X64和_M_AMD64.但它似乎没有讨论X32的架构选项.
如果Microsoft支持X32,那么我怀疑它将是一个类似于大地址空间感知或终端服务感知的选项.
Microsoft 实际上是否支持X32(而不是X86和X64)?
如果是这样,我如何确定何时在Windows下选择X32?
如果没有,那么为什么英特尔专门为Windows推出X32平台呢?
是否有可能有一个 ELF 文件包含来自两个 ISA 的可执行指令。也就是说,有一个 ELF 文件可以在两种架构上运行,例如 x86 和 PowerPC。
我想到的一个例子是几年前使用的 Apple 通用二进制文件。有什么方法可以在 Linux 发行版中实现类似的功能吗?我遇到过旨在做到这一点的 FatELF 项目,但它似乎已经死了
我正在开发一个插件系统来替换共享库。
在为共享库和库中的入口点设计 API 时,我知道 ABI 问题,例如导出的类,应该仔细设计。
例如,添加、删除或重新排序导出类的私有成员变量可能会导致不同的内存布局和运行时错误(根据我的理解,这就是 Pimpl 模式可能有用的原因)。当然,在修改导出的类时,还有许多其他的陷阱需要避免。
我在这里建立了一个小例子来说明我的问题。
首先,我为插件开发人员提供以下标头:
// character.h
#ifndef CHARACTER_H
#define CHARACTER_H
#include <iostream>
class Character
{
public:
virtual std::string name() = 0;
virtual ~Character() = 0;
};
inline Character::~Character() {}
#endif
Run Code Online (Sandbox Code Playgroud)
然后将插件构建为共享库“ libcharacter.so”:
#include "character.h"
#include <iostream>
class Wizard : public Character
{
public:
virtual std::string name() {
return "wizard";
}
};
extern "C"
{
Wizard *createCharacter()
{
return new Wizard;
}
}
Run Code Online (Sandbox Code Playgroud)
最后是使用插件的主应用程序:
#include "character.h"
#include <iostream>
#include <dlfcn.h>
int main(int argc, …Run Code Online (Sandbox Code Playgroud) 我想知道使用哪个编译器来编译C ++中的特定库是否很重要?因为我听说过ABI兼容性,所以很好奇它是否重要!
例如,我可以下载用MSVC编译的Windows的OpenCV二进制文件(包括dll和lib),并在用MinGW编译的另一个代码中使用它们吗?
由于 ARM64 中缺少 PUSH 和 POP 指令,我在理解 SP 在 ARM64 中的工作方式时遇到了问题。
如果我要 PUSH/POP,SP 是否会减少/增加 4、8 或 16 个字节?
我正在阅读文档说堆栈帧必须按 16 字节对齐,但是当我调试时,情况似乎并非如此。