主要是因为我想知道我是否可以:您可以通过一点内联汇编来查看寄存器中是否存在某些内容。它两次请求相同的输入,一次在寄存器中,一次在任何地方,无论是内存还是寄存器。如果更改一个更改两者,那么您将获得与两个输入相同的寄存器。
以下使用 gcc 在 x86 和 x86_64 上工作:
#include <iostream>
#define isRegister(x) \
{ \
bool result; \
asm("notl %1; /* alter always register one */ \
cmpl %2, %1; /* has the other changed? */ \
sete %0; /* save to result */ \
notl %1; /* restore */" \
:"=&q"(result) /* out */ \
:"r"(x), "g"(x) /* in */ \
: /* no clobber */ \
); \
std::cout << (result ? "Yes" : "No") << "\n"; \
}
int main() {
register int a=666;
int b=667;
register int c = 0;
int d = 0;
isRegister(a);
isRegister(b);
isRegister(c);
isRegister(d);
std::cout << a << ", " << b << ", " << c << ", " << d << "\n";
}
在这里使用内联 asm 会立即使其不可移植,并且您可能希望在实际代码中使用 gcc 的 expr-statement 扩展,这再次使其不可移植并且它是一个脆弱的 hack。您需要小心 - 积极的优化可以打破这一点。这是一个很好的提示,您应该将其留给编译器,而不是担心寄存器中有什么,并且实际使用此代码可能会改变答案的非零风险,因为它可能会占用寄存器本身!