当前位置: 首页 > 工具软件 > loop > 使用案例 >

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

谭鹏云
2023-12-01

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

 类似资料: