Eğitim amaçlı olarak, bir parça IL öğreniyorum (esas olarak, kaputun altında “%” ye ne olduğunu merak ettiğim için (ki bu, rem olarak ortaya çıktı) ve kazmaya başladı ...). ldc.i4.1 sonraBu durumda 'br.s' IL opcode neden kullanılıyor?
.method public hidebysig static bool ReturnTrue() cil managed
{
// Code size 7 (0x7)
.maxstack 1
.locals init ([0] bool CS$1$0000)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: br.s IL_0005
IL_0005: ldloc.0
IL_0006: ret
} // End of method Primes::ReturnTrue
yığını ve stloc üzerinde 1 iter:
Sadece biraz şeyler yıkmak doğru döndüren ve 'gn' işlem kodu merak ediyordum, bir yöntem yazdı .0 bunu 0'ıncu lokasyona yerleştirir, br.s temel olarak (bildiğim kadarıyla) IL_0005 satırında ldloc.0'a 'goto' yapar. Neden bu
mı? Neden hiç bir IL_0004 hattı yok ki bu yüzden bu ihmal edilebilir?
Hiçbir IL_0004 yoktur, çünkü 'br.s' iki bayttır. Sanırım optimizasyonları devre dışı bıraktın mı? Evet, o zaman garip şeyler beklersin. Optimizasyonları açtığınızda ne elde edersiniz? – hvd
Ardından '1'i yığına iter ve hemen geri döner. IL_0000: ldc.i4.1 IL_0001: yöntemi başlangıcından itibaren bayt öğretim ofset olduğu xxxx "IL_xxxx" de ret – Apeiron
. br.s, atlamak için hedef komut olan tek bir bayt işleneni alan bir tek bayt komutudur (geri kalanı gibi). –