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