Was ist der Unterschied zwischen ldc.i4.s und ldc.i4?

8

Ich habe über die Intermediate Language for C # (IL) gelernt und stieß auf den folgenden Code: -

%Vor%

Ich bin ein Anfänger im Verständnis von IL, aber ich kenne die Bedeutung dieser sehr grundlegenden Anweisungen, die im obigen Beispiel in Main verwendet werden.

Meine Frage ist, besteht ein Unterschied zwischen der Anweisung ldc.i4.s , die zum Laden von 50 verwendet wird, und der Anweisung ldc.i4 , die verwendet wird, um 30 auf den Auswertestapel zu laden.

Wie entscheidet der Compiler, welche Anweisung (aus diesen beiden) wann verwendet wird?

    
Pratik Singhal 03.02.2014, 04:56
quelle

4 Antworten

7

Für vorzeichenbehaftete Bytewerte, Nein.

  

ldc.i4.s ist eine effizientere Kodierung für das Ausdrücken der ganzen Zahlen   -128 bis 127 auf den Auswertungsstapel.

Siehe MSDN

    
leppie 03.02.2014, 04:59
quelle
2

Der Unterschied besteht darin, dass ldc.i4.s nur verwendet werden kann, wenn der Operand in ein vorzeichenbehaftetes Byte (-128 bis einschließlich 127) passen kann. Der Vorteil ist, dass die resultierende IL kürzer ist, was Platz im Programm spart. Dies ist hilfreich, da viele konstante Lasten kleine Konstanten verwenden.

    
Doug McClean 03.02.2014 04:58
quelle
2

Sie können ldc.i4 .s , wenn Ihr Wert zwischen -128 to 127 liegt.

  

ldc.i4.s ist eine effizientere Kodierung, um die ganzen Zahlen abzustoßen   -128 bis 127 auf den Auswertungsstapel.

    
Shahrooz Jafari 03.02.2014 05:00
quelle
2

ldc.i4.s

  

Drücken Sie num des Typs int32 als int32 auf den Stack. Drücken Sie -1 des Typs int32   auf den Stack als int32 (Alias ​​für ldc.i4.m1). Drücken Sie num auf den Stapel   als int32, kurze Form. Drücken Sie num vom Typ int64 als int64 auf den Stack.

     

OpCode: 0x1F

     

Anweisung: ldc.i4.s

     

Beschreibung: Drücken Sie num auf den Stack als int32, kurze Form.

ldc.i4

  

Drücken Sie -1 als Int32 auf den Stack (Alias ​​für ldc.i4.m1).   Drücken Sie num auf den Stack als int32, kurze Form. Drücken Sie num des Typs int64   auf den Stapel als int64. Drücken Sie num des Typs float32 als F auf den Stapel.

     

OpCode: 0x20

     

Anweisung: ldc.i4

     

Beschreibung: Drücken Sie num des Typs int32 als int32 auf den Stack. Basisanweisung

    
quelle

Tags und Links