在 x86 汇编中,loopnz 指令的循环条件需要同时满足两点:寄存器 cx 不等于 0,并且标志位 ZF 不等于 1。只要有任何一个条件不成立,循环就会提前结束。
下面这段代码演示了 loopnz 的用法:在内联汇编里先把变量 x 的值加载到 eax,再用 cmp 将其与 10 比较,相等时 ZF 被置为 1,循环便会退出;否则就把 eax 递增后继续下一轮。
int main(){
int x = 4;
__asm
{
mov eax, [x];
mov cx, 99d;
mov ebx, 10d;
next1:
cmp eax, ebx; 如果相等 zf 置1
pushf;
popf;
jz outt;
inc eax;
loopnz next1;
outt:
mov [x], eax;
}
cout << x;
system("pause");
return 0;
}
无限循环
如果把循环体里的 inc cx 放进用 loop 控制的循环,每次迭代都会把计数器重新拉高,于是 cx 永远不会递减到 0,就形成了一个无限循环。
__asm
{
mov cx, 99d;
next1:
inc cx;
loop next1;
}