【发布时间】:2014-06-03 02:45:23
【问题描述】:
我在理解 GNU 内联汇编语法方面非常糟糕,所以我希望一个实际的例子能有所帮助。鉴于以下程序集(x86-64,Clang 输出),我将如何使用相同的内联程序集构造函数? GCC 为同一个函数生成不同的代码,我想让它生成与 Clang (-O3) 输出相同的版本。
bittest(unsigned char, int):
btl %esi, %edi
setb %al
ret
这是 GCC (-O3) 产生的结果:
bittest(unsigned char, int):
movzx eax, dil
mov ecx, esi
sar eax, cl
and eax, 1
ret
这是函数的 C 代码:
bool bittest(unsigned char byte, int index)
{
return (byte >> index) & 1;
}
【问题讨论】:
-
我和帕特里克在一起,你在试图准确匹配 clang 时打错了电话。你可以简单地做 asm("btl %esi, %edi\nsetb %al\nret"),但你几乎肯定会后悔。如果你决定你愿意探索合理的替代方案,我有一些。另外,如果您要使用内联 asm,您是否查看了新文档?他们最近被重写了。它们组织得更好,并且包含许多示例:gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
-
那么 GCC 生成了什么?你确定它至少没有那么好?
-
您在询问有关编程细节的问题,但没有暗示您的更大目标。你在优化性能吗?为了按位正确?只是为了学习?还是出于完全不同的原因?这可能会严重影响给出的答案 - 目前我不知道你的目标是什么,什么是可接受的答案。
-
@MatsPetersson 更新了我的问题。
-
@KlaasvanGend 我实际上无法访问 Clang atm 的本地副本,只有 MinGW。我想比较一下性能。
标签: c++ assembly x86-64 inline-assembly