考虑以下代码:
#include <stdio.h>
void main() {
uint32_t num = 2;
__asm__ __volatile__ ("CPUID");
__asm__ __volatile__ ("movl $1, %%ecx":);
__asm__ __volatile__ ("andl $0, %%ecx": "=r"(num));
printf("%i\n", num);
}
我最初的期望是这段代码会打印0
,如果我注释掉该CPUID
行,它会打印,但它给了我垃圾。经过一些试验、错误和研究,我意识到我得到了一个随机寄存器的值。显然 GCC 并不认为我想要执行语句的结果。
问题是我已经看到(其他人的)代码依赖于该语句正确地获得 AND 的结果,而不管其他寄存器发生了什么。鉴于我的观察,显然这样的代码被破坏了,"=r"
应该用"=c"
.
我的问题是,我们能否始终依赖于"=r"
约束行为一致或根据明显的期望?还是 GCC 的实现太不透明/奇怪/其他,最好在每种情况下都避免它?