x86汇编_LOOPZ / LOOPE,LOOPNZ / LOOPNE_笔记_38

本文详细介绍了汇编语言中的LOOPZ和LOOPNZ指令,它们在32位环境下如何操作ECX寄存器并根据零标志位(ZF)进行条件跳转。通过高级代码的形式展示了这两个指令的逻辑,并提供了一个实际的代码示例,演示了如何利用test指令判断有符号数的正负,并结合jz和jnz指令跳出循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LOOPZ与LOOPE功能无任何差别,操作码是相同的。

LOOPZ 标号:在32位下,将ECX减去1,当ECX不等于0而且零标志位等于1时,跳转到标号所在位置。或者理解为LOOP指令再加上判断零标志位是否为1。用高级代码表示如下:

ECX = ECX - 1
if ECX > 0 and ZF = 1, jump to 标号

LOOPNZ与LOOPNE功能无任何差别,操作码是相同的。

LOOPNZ 标号:在32位下,将ECX减去1,当ECX不等于0而且零标志位等于0时,跳转到标号所在位置。或者理解为LOOP指令再加上判断零标志位是否为0。用高级代码表示如下:

ECX = ECX - 1
if ECX > 0 and ZF = 0, jump to 标号

此处再次复习test的内容,1 1得1,其它得0,test相当于and但只改变标志位而不改变操作数。

include Irvine32.inc
 
.data
array sword -9, -6, -1, -10, 9, 30, 40, 4
sentinel sword 0
 
.code
main proc
	nop
	mov edx, 0
	mov edi, offset array
	mov ecx, lengthof array
	;一个两字节的有符号数与8000H做test操作,结果可以改变ZF符号位。
	;根据ZF的值可以判断此数的正负。ZF=0说明它是正数,ZF=1说明是负数。
    ;有了ZF值后,用jz或jnz跳转指令,跳出循环,做其它操作。
	start:	test sword ptr [edi], 1000000000000000b	
				pushfd
				jz found
				add edi, type array
				popfd
	        loop start
	jmp finish
	found:	mov dx, [edi]
	finish:
	invoke ExitProcess, 0
main endp
 
end main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值