程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 《C# to IL》第三章 選擇和循環(2)

《C# to IL》第三章 選擇和循環(2)

編輯:關於C語言

函數abc示范了這個概念。在這個函數中,代碼繞過了指令 ldc.i4.s 30。因此,返回值顯示為20而不是30。從而,IL使用br指令來無條件地跳躍到代碼的任何部分 。(程序集指令br獲取4字節,而在.sr之前的br,即br.s獲取1字節,對於每個標記為.s的指令,解釋都 是相同的。)

br指令是IL得以運轉的關鍵組件之一。

a.cs

class zzz
{
static bool i = true;
public static void Main()
{
if (i)
System.Console.WriteLine("hi");
}
}

a.il

.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.fIEld private static bool i
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldsfld     bool zzz::i
brfalse.s IL_0011
ldstr      "hi"
call       void [mscorlib]System.Console::WriteLine(class System.String)
IL_0011: ret
}
.method public hidebysig specialname rtspecialname static void .cctor() il managed
{
ldc.i4.1
stsfld     bool zzz::i
ret
}
}

Output

hi

在我們的C#程序中,我們將靜態變量初始化為true值。

l 靜態變量,如果它們是字段,就會在靜態構造函數.cctor中被初始化。這會在上面的程序中顯 示。

l 另一方面,局部變量在它們所在的函數中被初始化。

這裡,讓人吃驚的是,使用 ldc指令將值1放置在棧上的靜態構造函數中。即使同時在C#和IL中定義了字段i,還是沒有true或false這 樣的符號。

接下來,使用stsfld將靜態變量i初始化為值1,盡管變量是布爾類型的。這就證實了 IL支持bool數據類型,它不會識別出單詞true或false。因此,在IL中,布爾值分別只是數字1或0的別名 。

布爾運算符TRUE或FALSE是由C#引進的關鍵字,用來使程序員的工作更加輕松。由於IL不直接支 持這些關鍵字,所以它會替代地使用數字1或0。

指令ldsfld把靜態變量的值加載到棧上。指令 brfalse對棧進行掃描。如果它找到了數字1,它就會將其解釋為TRUE,而如果它找到了數字0,它就會將 其解釋為FALSE。

在這個例子中,它在棧上找到的值是1或TRUE,所以它不會跳轉到標號IL_0011。 在從C#到IL的轉換中,ildasm使用以IL_開始的名稱來代替標號。

指令brfalse表示“如果 FALSE就跳轉到標號”。這不同於br,後者總是會導致一個跳轉。從而,brfalse是一個有條件的跳 轉指令。

在IL中沒有提供if語句功能的指令。C#中的if語句會被轉換為IL中的轉移(branch)指 令。我們所處的任何匯編器,都沒有像if結構體這樣的高級概念。

可以看到,我們剛剛學到的那 些知識,對於我們掌握IL是非常重要的。這將幫助我們獲得——區別關於哪個概念是IL的一部 分而哪些是由編程語言的設計者引進——的能力

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved