编程语言
首页 > 编程语言> > 嵌入汇编程序来处理便携式C中的64位寄存器

嵌入汇编程序来处理便携式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