【发布时间】:2018-02-25 05:09:09
【问题描述】:
这段代码的输出:
int i=0;
while(i<5)
{
asm volatile
(
"addl $1,%0"
:"=r"(i)
:
:"memory"
);
printf("%d\n",i);
}
是这样的:
2
3
3
3
.
.
.
但应该是这样的:
1
2
3
4
5
为什么会这样?我似乎无法理解问题出在哪里。
【问题讨论】:
-
检查反汇编。尽管编译器可以/会有所不同,但它并没有初始化寄存器,而是每次通过循环都会增加它。当您使用 jlahd 的答案时,您会看到它在循环之前添加了一条将寄存器归零的指令。
标签: c gcc x86 inline-assembly