嵌入汇编程序来处理便携式C中的64位寄存器
作者:互联网
我有一个简单的(但性能至关重要的)C语言(嵌入在C中)来操作数据缓冲区…算法’自然’使用64位大端寄存器值 – 我想用汇编程序优化它获得对进位标志和BSWAP的直接访问,因此,避免必须一次操作一个字节的64位值.
我希望解决方案可以在OS /编译器之间移植 – 最低限度地支持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 ;
}
如您所见,差异很大.他们没有办法绕过他们.这些是我为32位环境编写的大型整数算术库.
至于在32位可执行文件中嵌入64位指令,我认为这是禁止的.据我了解,32位可执行文件在32位模式下运行,任何64位指令只会生成陷阱.
标签:visual-c-2010,c,assembly,x86-64,g 来源: https://codeday.me/bug/20190927/1824575.html