2009-11-18 5 views
6

Qual è la differenza tra le istruzioni di montaggio LOOP, LOOPE e LOOPNE?LOOP, LOOPE, LOOPNE?

+2

Non utilizzare queste istruzioni; sono molto lenti sulle moderne CPU. Usa invece la ramificazione a mano. –

+1

@Alex Strange: hai qualche prova a supporto della tua affermazione? Grazie. – Timotei

+1

@Timotei Dolean: guarda le tabelle di istruzioni in http://agner.org/optimize/. Un libro di testo sulla CPU che discute della microcodifica (e si spera che alcuni lo facciano) spiegherà il ragionamento. –

risposta

15

LOOP decrementa ecx e controlla se ecx non è zero, se tale condizione è soddisfatta salta all'etichetta specificata, altrimenti cade attraverso.

LOOPE decrementa ecx e controlla che ecx non sia zero e ZF è impostato - se queste condizioni sono soddisfatte, salta all'etichetta, altrimenti cade attraverso.

LOOPNE è uguale a LOOPE tranne che richiede che ZF non sia impostato (vale a dire zero) per eseguire il salto.

+8

Inoltre non è stato chiesto vorrei sottolineare che tutte le istruzioni LOOP sono molto più lente della controparte DEC ECX/JNZ. Questo è inteso perché LOOP dovrebbe essere utilizzato al momento solo per i cicli di calibrazione del ritardo utilizzati per i driver hardware e simili. –

+0

@NilsPipenbrinck: su quali processori è più lento? Qual'è la tua fonte? –

+1

@JanusTroelsen, più lento da 80486 in poi. Sugli ultimi processori è ** molto ** più lento. Fonte: http://www.agner.org/optimize/ manual # 2. – Johan

4

Tempo per un Google Books Reference

EDIT: Sinossi dal link: LOOPE e LOOPNE sono essenzialmente le istruzioni ciclo con un ulteriore controllo. LOOPE esegue il loop "while zero flag", il che significa che verrà eseguito fino a quando zero flag ZF è uno e l'incremento non viene raggiunto e LOOPNE esegue il ciclo "while non zero flag", il che significa che continua il ciclo fintanto che ZF è zero e l'incremento non è stato raggiunto. Tenere presente che nessuna di queste istruzioni influisce in modo inerente sullo stato di ZF.

+1

Credo che sia meglio non solo fornire un collegamento, ma citare il materiale pertinente dalla fonte, nel caso in cui il collegamento diventi invalido. –

2

Le istruzioni LOOP, così come JCXZ/JECXZ sono un po 'lente; tuttavia, hanno ancora il loro posto nel codice moderno.

L'alta velocità non è sempre un problema nei loop. Ad esempio, se eseguiamo un ciclo una sola volta durante l'avvio del programma e il conteggio delle iterazioni è ridotto, il tempo richiesto non verrà notato.

Un altro esempio è un ciclo in cui vengono chiamate le funzioni API di Windows; il tempo trascorso nella chiamata API probabilmente rende il tempo di esecuzione LOOP banale. Ancora, questo si applica quando il numero di iterazioni è piccolo.

Considerare queste istruzioni come "un altro strumento nella casella degli strumenti"; utilizzare lo strumento giusto per il lavoro;)