Domanda

sto prendendo un'assemblea Naturalmente ora, e il ragazzo che controlla i nostri compiti a casa è un saccente vecchia scuola ottimizzazione mostro. Per esempio si detrae il 10% se vede:

mov ax, 0

invece che:

xor ax,ax

anche se è utilizzata una sola volta.

Io non sono un principiante completo in assemblea programing ma io non sono un esperto di ottimizzazione, quindi ho bisogno del vostro aiuto in qualcosa (potrebbe essere una domanda molto stupida, ma mi chiedere in ogni caso): se devo impostare un valore registro ad 1 o (-1) è meglio dell'uso:

mov ax, 1

o fare qualcosa di simile:

xor ax,ax
inc ax

ho davvero bisogno di un buon grado, quindi sto cercando di ottenere il più ottimizzato possibile. (Ho bisogno di ottimizzare il tempo e le dimensioni del codice)

È stato utile?

Soluzione

Un google rapido per 8086 instructions timings size alzato http://8086.tk/ che sembra avere tutti i tempi e formati per il 8086 (e più) set di istruzioni.

Non c'è dubbio che si potrebbe trovare doco ufficiale Intel sul web con informazioni simili.

Per la vostra domanda specifica:

xor ax,ax
inc ax

prende 3 + 3 = 6 cicli di clock e 2 + 1 = 3 byte mentre

mov ax,1

prende 4 cicli di clock e 3 byte.

Quindi, il secondo è meglio in questo caso.


Ma è necessario parlare con il vostro istituto educativo su questo ragazzo. 10% per una cosa semplice come che i mendicanti convinzione.

Si dovrebbe chiedere che cosa dovrebbe essere fatto nel caso in cui si hanno due possibilità, una più veloce e uno più corto.

Poi, una volta che hanno ammesso che ci sono modi diversi per il codice a seconda di ciò che si sta cercando di raggiungere, dire loro che quello che si sta cercando di realizzare è la leggibilità e la manutenibilità e seriamente non poteva dare un salto circa un ciclo di spreco o di byte di qua o di là * a .

L'ottimizzazione è qualcosa che generalmente, se e quando si ha un problema di prestazioni, dopo un pezzo di codice è in uno stato di quasi completa - è quasi sempre fatica sprecata quando il codice è ancora soggetto ad un rischio non trascurabile di cambiamento .

Per quel che vale, sub ax,ax sembra essere alla pari con xor ax,ax in termini di cicli di clock e byte, quindi forse si potrebbe buttare in che la prossima volta mescolare a indurlo po 'più di lavoro.

* a) No, non proprio, ma è divertente per sfogare ogni tanto: -)

Altri suggerimenti

Si sta meglio con

mov AX, 1

sul 8086. Se stai contenuto del registro di monitoraggio, si può eventualmente fare meglio se si sa che, per esempio, BX ha già un 1 in esso:

mov AX, BX

o se si sa che è AH 0:

mov AL, 1

ecc.

A seconda delle circostanze, si può essere in grado di cavarsela con ...

 sbb ax, ax

Il risultato sarà o 0 se il flag di carry non è impostato o -1 se è impostato il flag di riporto.

Tuttavia, se l'esempio di cui sopra non è applicabile alla vostra situazione, mi sento di raccomandare il

xor  ax, ax
inc  ax
Metodo

. Esso dovrebbe soddisfare il vostro professore per le dimensioni. Tuttavia, se il processore impiega qualsiasi tubo-lining, mi aspetto che ci sia un po 'di accoppiamento simile ritardo tra le due istruzioni (potrei benissimo sbagliarmi su questo). Se esiste una tale accoppiamento, la velocità potrebbe essere migliorata un po 'riordinando leggermente le istruzioni per avere un'altra istruzione tra di loro (uno che non usa l'ascia).

Spero che questo aiuti.

I userebbe mov [e]ax, 1 in nessun caso. La sua codifica non oltre la sequenza hackier xor è, e sono abbastanza sicuro che sia più veloce un po 'ovunque. 8086 è appena sufficiente strano per essere l'eccezione, e come che cosa è così lento, un micro-ottimizzazione come questo renderebbe più differenza. Ma qualsiasi altra parte: l'esecuzione di 2 istruzioni "facili" sarà sempre più lento di esecuzione 1, soprattutto se si considera i rischi di dati e lunghe tubazioni. Si sta cercando di leggere un registro a molto prossima istruzione dopo la modifica, quindi a meno che il barattolo CPU bypass il risultato dalla fase N della pipeline (dove il xor è in esecuzione) per mettere in scena N-1 (dove l'inc è cercando di di carico il registro, per non parlare aggiungendo 1 al suo valore), si sta andando ad avere bancarelle.

Altre cose da considerare: di ricupero della larghezza di banda (discutibile per il codice a 16 bit, entrambi sono 3 byte); evita mov mutevoli bandiere (più probabile che sia utile che tutti costringendo a zero); a seconda di quali valori altri registri potrebbero tenere, si potrebbe forse fare lea ax,[bx+1] (anche 3 byte, anche in codice a 32 bit, nessun effetto sulle bandiere); come altri hanno detto, sbb ax,ax potrebbe funzionare anche in circostanze -. è anche più brevi a 2 byte

Quando di fronte a questo tipo di micro-ottimizzazioni si dovrebbe davvero misura le alternative invece di affidarsi ciecamente anche sui manuali del processore.

P.S. Nuovo compiti a casa:? È xor bx,bx qualsiasi più veloce di xor bx,cx (su qualsiasi processore)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top