【发布时间】:2018-06-04 06:15:14
【问题描述】:
考虑以下汇编代码循环:
#include <iostream>
#define ADD_LOOP(i, n, v) \
asm volatile ( \
"movw %1, %%cx ;" \
"movq %2, %%rax ;" \
"movq $0, %%rbx ;" \
"for: ;" \
"addq %%rax, %%rbx ;" \
"decw %%cx ;" \
"jnz for ;" \
"movq %%rbx, %0 ;" \
: "=x"(v) \
: "n"(i), "x"(n) \
: "%cx", "%rax", "%rbx" \
);
int main() {
uint16_t iter(10000);
uint64_t num(5);
uint64_t val;
ADD_LOOP(iter, num, val)
std::cout << val << std::endl;
return 0;
}
是否可以从上面指定的循环中调用 C 函数(或它的机器代码输出)?
例如:
#include <wmmintrin.h>
int main() {
__m128i x, y;
for(int i = 0; i < 10; i++) {
x = __builtin_ia32_aesenc128(x, y);
}
return 0;
}
谢谢
【问题讨论】:
-
当然可以。都是二进制指令代码,所以可以调用,(权限/权限等允许)。
-
请详细说明您想要实现的目标。你想从汇编中调用 C 函数,还是想在汇编中调用和内在函数?要调用函数,您只需遵循所选平台的 C ABI。另一方面,内在函数不是函数,而是使编译器生成一些特定于平台的指令(如内存屏障、原子指令、各种向量扩展等)的方式,因此它们不是被调用而是被程序集替换本身。
-
您正在使用 C++。也许它是非常 C 风格的 C++,但它仍然是 C++。
-
我理解你的意思,但你仍然需要一个 c++ 编译器,它强制 c++ 并且有些东西是不同的。就像 c 具有来自 void 指针的隐式转换。
-
这个编辑把它变成了一个完全不同的问题。现在是关于调试 GNU C 内联汇编约束,而不是关于如何使用内联汇编中的
__builtin函数。这应该是一个新问题。
标签: c++ gcc assembly inline-assembly built-in