最近在学32位汇编,在看到 loop和loope时有不太明白的地方,就去网上找例子,看到了这个解答
loop不用我多解释了吧? loope和loopne就是比loop多了一个测试ZF标志位的东西 loope是只有在CX不等于0和ZF=1的情况下才执行循环 loopne是是只有在CX不等于0和ZF=0的情况下才执行循环 例子: assume cs:code,ds:data data segment buff db 12,45,67,23,0FFH data ends code segment start: mov ax,data mov ds,ax mov bx,offset buff mov cx,100 circle: inc byte ptr [bx] inc bx cmp byte ptr [bx],0FFH loopne circle mov ax,4C00H int 21H code ends end start 这个程序的作用是将一个以字符0FFH为结束符的整数数组的元素全部加一 我这个例子没有什么实际的意义,正常的程序不会用可能用到的数字做结束标记的 当cmp byte ptr [bx],0FFH中[bx]指向的字节就是0FFH的时候ZF就变成了0,这时候就算CX不是0,但由于ZF=1了,所以loopne执行循环的条件就不存在了,所以退出循环 其实在我提供的那个例子里CX只起到了一个上限的作用,也就说如果数组的长度大于100的话,后面的元素就不管了 其实就是节省了一条jz或者是jnz指令 翻译成C语言就是这样: for (i=0;i<=XX;i++) { ... if (XX) break; ... }