2012-11-23 11 views
7

Il seguente codice scritto in C# in VS2010 per .Net 4.0:. L'assemblaggio netto aggiunge il superfluo E quando si imposta il bool su TRUE?

bool b = false; 

ha il seguente smontaggio:

XOR EDX,EDX 
MOV DWORD PTR[EBP-3Ch],EDX 

che ha perfettamente senso.

Tuttavia, il seguente codice:

bool b = true; 

ha il seguente smontaggio:

MOV EAX,1 
AND EAX,0FFh 
MOV DWORD PTR[EBP-3Ch],EAX 

Qual è lo scopo del funzionamento AND? Perché non solo MOV EAX,1?

Line | EAX 
----------- 
    1 | 0x01 
    2 | 0x01 & 0xFF = 0x01 
    3 | 0xFF 
+0

'0x01 & 0xFF = 0x01', no? – Blorgbeard

+0

Hmm, sembra che cancellerebbe i byte alti di EAX, ma 'MOV EAX, 1' dovrebbe farlo comunque .. – Blorgbeard

+1

Come stai trovando l'assembly hardware per una fonte CLR? – SAJ14SAJ

risposta

1

Questo codice

bool a = true; 
bool c = false; 

genera questa assemblea IL:

IL_0001: ldc.i4.1  
IL_0002: stloc.0  
IL_0003: ldc.i4.0  
IL_0004: stloc.1 

Si può vedere nella lingua intermedia, il codice è essenzialmente la stessa. Come il jitter lo sta traducendo, o perché non farebbe effettivamente un codice parallelo per i due è molto bizzarro.

(ho messo questo come una risposta al posto di un commento solo così ho potuto formattare la discussione per essere leggibile.)

2

Ho il sospetto che il and 0xff è troncamento a 8-bit bool. Non ne so abbastanza circa gli interni per essere sicuro, ma ho il sospetto che lo bool b = true stia diventando qualcosa come bool b = int(1) che sta diventando bool b = bool(int(1)) ed è che la coercizione a bool causa lo and 0xff. Vedo cose simili in epilogici x86 di funzioni C++ che restituiscono bool (ad esempio termina con test; setal) anziché restituire semplicemente un valore diverso da zero arbitrario.

Questo è il tipo di codice che un ottimizzatore di spioncino avrebbero risolto ...

+1

Capisco.Ma non avrebbe più senso prendere il valore dai registri AH o AL invece di EAX, allora? In questo modo il valore è già a 8 bit e il computer non ha bisogno di troncare da 32 bit a 8 bit. – Ozzah

+1

La destinazione è un DWORD, tuttavia, un registro a 8 bit non lo riempirebbe. – Blorgbeard

0

Il codice operativo e causa anche alcuni dei flag di stato da impostare (OF, CF, SF, ZF, e PF) secondo al manuale Intel (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html). Senza il contesto del resto delle istruzioni nella funzione è piuttosto difficile indovinare qual è lo scopo.

+0

'bool b = true' non sembra abbastanza complicato da richiedere i flag nella CPU. Non vedo perché dovrebbe esserci asimmetria tra 'bool b = true' e' bool b = false'. – Ozzah

+0

Potrebbe essere per le istruzioni che vengono eseguite in seguito. –

+0

Non ho mai imparato il linguaggio assembly assembly x86, dal momento che i miei giorni di assemblaggio sono passati da molto tempo. Ma i processori più vecchi, come il 6502, imposterebbero sicuramente diversi flag per un valore zero rispetto a quelli che avrebbero per gli altri, il che potrebbe influire sulle istruzioni successive del ramo. – SAJ14SAJ