gpt4 book ai didi

c++ - 嵌入汇编程序以在可移植 C++ 中操作 64 位寄存器

转载 作者:太空狗 更新时间:2023-10-29 23:54:07 24 4
gpt4 key购买 nike

我在 C 语言(嵌入 C++ 中)中有一个简单(但对性能至关重要)的算法来操作数据缓冲区...该算法“自然地”使用 64 位大端寄存器值 - 我想优化这使用汇编器直接访问进位标志和 BSWAP,因此避免必须一次一个字节地操作 64 位值。

我希望解决方案能够在操作系统/编译器之间移植——最低限度地支持 GNU g++ 和 Visual C++——以及分别在 Linux 和 Windows 之间移植。对于这两个平台,显然,我假设处理器支持 x86-64 指令集。

我找到了 this document about inline assembler for MSVC/Windows ,以及来自 Google 的几个片段,详细说明了 g++ 的不兼容语法。我接受我可能需要在每种方言中单独实现此功能。我一直无法找到足够详细的语法/设施文档来应对这一发展。

我正在寻找的是清晰的文档,其中详细说明了我可用的工具 - 包括 MS 和 GNU 工具集。虽然我多年前写了一些 32 位汇编程序,但我已经生疏了 - 我会受益于简明的文档详细说明在汇编级别可用的设施。

更复杂的是,我想使用 Visual C++ Express Edition 2010 为 Windows 编译...我知道这是一个 32 位编译器 - 但是,我想知道是否可以嵌入 64 位汇编成它的可执行文件?在我计划手动编码的部分中,我只关心 64 位性能。

任何人都可以提供任何指示(请原谅双关语......)?

最佳答案

为了让您体验一下前进道路上的障碍,这里有一个简单的内联汇编函数,有两种语言。首先,Borland C++ Builder 版本(我认为它也可以在 MSVC++ 下编译):

int BNASM_AddScalar (DWORD* result, DWORD x)
{
int carry = 0 ;
__asm
{
mov ebx,result
xor eax,eax
mov ecx,x
add [ebx],ecx
adc carry,eax // Return the carry flag
}
return carry ;
}

现在,g++ 版本:

int BNASM_AddScalar (DWORD* result, DWORD x)
{
int carry = 0 ;
asm volatile (
" addl %%ecx,(%%edx)\n"
" adcl $0,%%eax\n" // Return the carry flag
: "+a"(carry) // Output (and input): carry in eax
: "d"(result), "c"(x) // Input: result in edx and x in ecx
) ;
return carry ;
}

如您所见,差异很大。而且没有办法绕过它们。这些来 self 为 32 位环境编写的大型整数算术库。

至于在 32 位可执行文件中嵌入 64 位指令,我认为这是禁止的。据我了解,32 位可执行文件以 32 位模式运行,任何 64 位指令只会生成陷阱。

关于c++ - 嵌入汇编程序以在可移植 C++ 中操作 64 位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7859568/

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