2012-11-23 4 views
7

Der folgende Code in C# in VS2010 geschrieben für .Net 4.0:.Net-Assembly fügt überflüssiges AND hinzu, wenn bool auf TRUE gesetzt wird?

bool b = false; 

hat die folgende Zerlegung:

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

, die durchaus Sinn macht.

jedoch der folgende Code:

bool b = true; 

hat die folgende Zerlegung:

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

Was ist der Zweck der AND Betrieb? Warum nicht einfach MOV EAX,1?

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

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

+0

Hmm, es scheint, als würde es die hohen Bytes von EAX löschen, aber 'MOV EAX, 1' sollte das trotzdem tun. – Blorgbeard

+1

Wie finden Sie die Hardware-Baugruppe für eine CLR-Quelle? – SAJ14SAJ

Antwort

1

Dieser Code

bool a = true; 
bool c = false; 

generiert diese IL assembly:

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

Sie in der Zwischensprache sehen kann, ist der Code im Wesentlichen gleich. Wie der Jitter das übersetzt, oder warum es keinen effektiven Parallelcode für die beiden gibt, ist sehr bizarr.

(Ich habe dies als eine Antwort anstelle eines Kommentars nur so konnte ich die Diskussion formatiert lesbar sein.)

2

Ich vermute, die and 0xff Abschneiden ist auf 8-Bit-Bool. Ich weiß nicht annähernd genug über die Interna, um sicher zu sein, aber ich vermute, bool b = true wird so etwas wie bool b = int(1), die dann bool b = bool(int(1)) wird und es ist dieser Zwang zu bool verursacht die and 0xff. Ich sehe ähnliche Dinge in x86-Epilogen von C++ - Funktionen, die bool zurückgeben (z. B. endend in test; setal), anstatt nur einen beliebigen Nicht-Null-Wert zurückzugeben.

Dies ist die Art von Code ist, dass ein Guckloch-Optimierer beheben würde ...

+1

Ich sehe.Aber wäre es nicht sinnvoller, den Wert aus den AH- oder AL-Registern anstatt aus EAX zu nehmen? Auf diese Weise ist der Wert bereits 8 Bit und der Computer muss 32 Bit nicht auf 8 Bit abschneiden. – Ozzah

+1

Das Ziel ist jedoch ein DWORD, ein 8-Bit-Register würde es nicht füllen. – Blorgbeard

0

Die UND-Opcode wird auch einige der Status FLAGS verursachen eingestellt werden (OF, CF, SF, ZF, und PF) nach zum Intel Handbuch (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html). Ohne den Kontext der restlichen Anweisungen in der Funktion ist es ziemlich schwer zu erraten, was der Zweck ist.

+0

'bool b = true' scheint nicht wirklich kompliziert genug zu sein, um Flags in der CPU zu benötigen. Ich sehe nicht, warum es eine Asymmetrie zwischen "bool b = true" und "bool b = false" geben sollte. – Ozzah

+0

Es kann für Anweisungen sein, die später ausgeführt werden. –

+0

Ich habe nie die Assemblersprache der x86-Familie gelernt, da meine Montagezeit längst vorbei ist. Aber ältere Prozessoren, wie der 6502, würden definitiv andere Flags für einen Nullwert setzen als für andere, was nachfolgende Verzweigungsbefehle beeinflussen könnte. – SAJ14SAJ

Verwandte Themen