在 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;
	}