Qual è la differenza tra le istruzioni di montaggio LOOP
, LOOPE
e LOOPNE
?LOOP, LOOPE, LOOPNE?
risposta
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.
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. –
@NilsPipenbrinck: su quali processori è più lento? Qual'è la tua fonte? –
@JanusTroelsen, più lento da 80486 in poi. Sugli ultimi processori è ** molto ** più lento. Fonte: http://www.agner.org/optimize/ manual # 2. – Johan
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.
Credo che sia meglio non solo fornire un collegamento, ma citare il materiale pertinente dalla fonte, nel caso in cui il collegamento diventi invalido. –
Hai provato a cercare in un riferimento di set di istruzioni, for example in this one by Intel?
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;)
- 1. clang: Force loop srotolare per loop specifico
- 2. Matlab per loop con contatore loop decrescente
- 3. Python, prossima iterazione del loop su un loop
- 4. per loop vs while loop vs ciclo foreach PHP
- 5. Diagramma di flusso "per ogni" loop loop senza incremento variabile
- 6. JMeter - controller di loop con numero di loop variabile
- 7. Batch and the loop
- 8. loop in due direzioni
- 9. Double-Loop in msbuild?
- 10. come evitare loop
- 11. Loop di messaggi Erlang
- 12. Livello loop dinamico nidificato
- 13. Loop in R Markdown
- 14. Parallel For-Loop
- 15. Schema (racket) - Librerie loop
- 16. Android Webview Redirect loop
- 17. Test di loop Mocha?
- 18. Matlab parfor loop indexing
- 19. Ottimizza JSonArray for Loop
- 20. UIPickerView - Loop dei dati
- 21. Ottimizzazione dei loop "statici"
- 22. loop through JPanel
- 23. Loop di debug
- 24. Loop di sincronizzazione stallo
- 25. Hoare Logic Loop Invariant
- 26. Foreach loop e compiti
- 27. Parallel.ForEach loop con BlockingCollection.GetConsumableEnumerable
- 28. ricorsivo Loop XSLT
- 29. Animazione loop continuo UIView.animateWithDuration
- 30. Media Player Loop: Android
Non utilizzare queste istruzioni; sono molto lenti sulle moderne CPU. Usa invece la ramificazione a mano. –
@Alex Strange: hai qualche prova a supporto della tua affermazione? Grazie. – Timotei
@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. –