Soru .NET IL .maxstack yönergesi nasıl çalışır?


.Maxstack'ın gerçekten nasıl çalıştığını bilmek isterim. Biliyorum ki, ilan ettiğin türlerin gerçek boyutuyla ilgisi yok ama onların sayısıyla. Benim sorularım:

  1. bu sadece için geçerlidir işlev veya tüm işlevler Bizim için mi çağırıyoruz?
  2. sadece işlev için olsa bile .maxstack bildirildi, Maxstack'in ne olduğunu nereden biliyorsun? dallanma var mı? Sen git ve gör tüm "yolları" ve geri dön maksimum değer mümkün mü?
  3. 16'ya ayarlıysam ne olur? aslında 17 değişken var?
  4. Eğer ceza alırsam çok büyük bir ceza var mı 256'ya mı ayarladın?

21
2017-08-06 20:39


Menşei




Cevaplar:


.maxstack IL doğrulamasının bir parçasıdır. temel olarak .maxstack JIT'e, yöntem için ayırması gereken maksimum yığın boyutunu bildirir. Örneğin, x = y + (a - b) Çevirir

(Sözü IL :)

1. Push y on the stack
2. Push a on the stack
3. Push b on the stack
4. Pop the last two items from the stack,
      substract them and
      push the result on the stack
5. Pop the last two items from the stack,
      add them and
      push the result on the stack
6. Store the last item on the stack in x and
      pop the last item from the stack

Gördüğünüz gibi, her seferinde yığında en fazla 3 öğe vardır. Eğer koyduysan .maxstack Bu yöntem için 2 (veya daha az), kod çalışmadı.

Ayrıca, sonsuz bir yığın boyutu gerektireceğinden böyle bir şeye sahip olamazsınız:

1. Push x on the stack
2. Jump to step 1

Sorularınızı cevaplamak için:

  1. Bu sadece işlev için veya aradığımız tüm işlevler için geçerli midir?

Sadece işlev için

  1. Sadece işlev için .maxstack bildirilmiş olsa bile, dallanma varsa ne maxstack olduğunu biliyor musunuz? Tüm "yolları" görüp, mümkün olan maksimum değeri geri getiriyor musunuz?

Gidip tüm yolları gör ve mümkün olan en yüksek değeri ver.

  1. 16'ya ayarlıyorum ve aslında 17 değişken var ise ne olur?

Değişken sayısı ile ilgisi yoktur, bkz. Lasse V. Karlsencevabı

  1. 256'ya ayarlıysam çok büyük bir ceza var mı?

İyi bir fikir gibi görünmüyor, ama bilmiyorum.

Gerçekten hesaplamak zorunda mısın .maxstack kendin? System.Reflection.Emit IIRC sizin için hesaplar.


24
2017-08-07 08:35



Her ne kadar olduğu gibi olmasına izin vermeliyim. Ben sadece bazı executables gelen IL kodunu düzenliyorum, ama eklediğim yöntem sadece 2 argüman var, bu yüzden IL yöntemi üzerinde zaten mevcut .maxstack asla müdahale etmeyeceğini düşünüyorum. - devoured elysium


Onunla hiçbir ilgisi yok numara değişkenlerin beyanı, ancak bunun yerine, bazı ifadeleri hesaplamak için herhangi bir zamanda, bir yığın üzerinde ne kadar değer atmanız gerektiği ile ilgili her şey.

Örneğin, aşağıdaki ifadede, yığının üzerine 2 değerin aktarılması gerektiğini varsayabilirim:

x = y + z;

Bu, mevcut en az 3 değişken, x, y ve z ve muhtemelen başkalarının da olmasıyla ilişkili değildir.

Maalesef, diğer sorularınızın cevabını bilmiyorum ve tahminlerin bazı cevaplar bulmanın bir yolu olacağını tahmin ediyorum.


5
2017-08-06 20:45



Ah. Yani, ifadelerim 8'den fazla işlenene sahip değilse ve yöntemimden çağıracağım herhangi bir işlev, 8'den fazla argümana sahip olmazsa, asla .maxstack 8'den daha fazlasına ihtiyacım olmaz. - devoured elysium
x = y + (a - b) Her iki operatörde sadece 2 işlenen olsa bile, yığın boyutu 3'e ihtiyaç duyar. - dtb


Daha iyi anlaşılması için aşağıdakilere ve ECMA STANDARD'a başvurabilirsiniz:

void  msd(string a,
  string b,
  string c,
  string d,
  string e)
  {
  Console.WriteLine(a);
}

msd("a","b","c","d","e");

Koştuğumda ildasm.exe Bunu anladım:

{
  .entrypoint
  // Code size       40 (0x28)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  nop
  IL_0002:  ldstr      "a"
  IL_0007:  ldstr      "b"
  IL_000c:  ldstr      "c"
  IL_0011:  ldstr      "d"
  IL_0016:  ldstr      "e"
  IL_001b:  call       void sf.Program::'<Main>g__msd|0_0'(string,
                                                           string,
                                                           string,
                                                           string,
                                                           string)
  IL_0020:  nop
  IL_0021:  call       string [mscorlib]System.Console::ReadLine()
  IL_0026:  pop
  IL_0027:  ret
} // end of method Program::Main

yukarıdan. Max'i buldum stakc push & pop talimatları ile belirlenmeyen değer.

Gerçek yığın sayı değerlerinin ne olduğunu bilmiyordum. Yani, ben referans ildasm gerçek maksimum yığın değerini belirlemek için sökme kodu.


0
2018-01-19 01:39