Domanda

(ia32) ad esempio,

test $eax, $eax

perché mai vorresti farlo?lo fa $eax & $eax, Giusto?non dovrebbe essere questo Sempre impostare il registro dei flag per dire che sono uguali...?

aggiunta:quindi il test imposterà ZF (come menzionato di seguito) se il registro è zero.quindi test (come usato sopra) viene utilizzato principalmente solo per verificare se un registro è vuoto?e ZF è impostato, se sì?

È stato utile?

Soluzione

Sarà impostato ZF (il flag zero) se il registro è pari a zero. Questo è probabilmente quello che è più comunemente usato per test. Sarà anche istituito altre bandiere in modo appropriato, ma c'è probabilmente molto meno uso per quelli.

Inoltre, vorrei ricordare che test in realtà non eseguire un confronto -. Si esegue un'operazione bit per bit and (buttare via il risultato, tranne che per le bandiere)

Per eseguire un confronto degli operandi, l'istruzione cmp sarebbe usato, che esegue un'operazione sub, eliminando i risultati eccetto per bandiera. Lei ha ragione che un

cmp $eax, $eax

non avrebbe molto senso, come le bandiere sarebbero impostati in base a un risultato pari a zero ogni volta.

Altri suggerimenti

Questa è l'impostazione della bandiera di zero, allo stesso modo che con or $eax,$eax può test non distruttivo per il flag di zero pure.

Imposta i flag Z e S sul processore, quindi puoi dire dopo "test eax,eax" (o qualsiasi altro registro 8, 16, 32 e penso 64 bit) se il valore è zero o se il bit di segno è impostato, utilizzando rispettivamente "je/jne/jz/jnz" o "js/jns".In 30 anni di programmazione per architetture x80/x86, l'ho fatto un numero enorme di volte, con la maggior parte delle combinazioni di registri.(Non lo usi in pratica su ESP!)

IIRC, c'è anche un bit di parità che viene calcolato, quindi facendo questo test puoi capire se il numero di bit impostati nel registro è pari o dispari, usando "jp/jnp".Io ho Mai aveva una utilità per questo.

Questa istruzione non serve a controllare solo se il valore di %eax è zero. Può essere in generale utilizzata per verificare se il valore %eax è zero o positivo o negativo. Il grande vantaggio di utilizzare questo modo è non modifica la valle di %eax (dopo l'esecuzione %eax & %eax, appena rigetti via il valore) e imposta i flag di condizione come segue.

se il valore% eax è pari a zero, OF, CF, ZF = 0 (azzeramento)
altro SF = MSB of the result (qui, risultato è %eax & %eax). Quindi, se il numero è negativo, otteniamo SF = 1, altrimenti SF = 0.

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