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