MSIL 初級讀本 第二部分 區域性變數

2022-03-04 12:57:37 字數 2037 閱讀 4868

宣告:    本文譯自 kenny kerr  的 blog,如果大家有更好的 msil 入門文章也歡迎推薦,謝謝。

在本文的第二部分裡,我將**一下區域性變數的使用。為了展示這個過程,讓我們來寫乙個將兩數相加的簡單程式。

在 msil 方法中,使用.locals指示符來宣告區域性變數

.local init( int32 first, 

int32 second,

int32 result )

該語句為當前方法宣告了三個區域性變數。在本例中,恰巧都是 int32 型別—— system.int32 型別的同義詞。init指定這些變數需要以其對應型別的預設值進行初始化。變數名稱也可以被省略,那樣的話你需要通過宣告時的zero-based 索引來指明變數。當然,使用變數名會增加**的可讀性。

在我們繼續之前,需要先明確一下 msil 當中顯式使用棧的方式。當你需要向乙個指令傳值的時候,首先需要把那些值壓棧。而指令需要進行彈棧操作以讀出數值。類似地,在呼叫方法時也需要將物件引用 ( 如果有的話 ) 和需要傳遞的引數按順序壓棧。在開始呼叫方法時,所有的引數以及物件引用會被彈棧。使用ldloc指令來將變數的值壓棧;使用stloc指令將棧頂的值彈出並儲存到指定變數中。另外要時刻記得,值型別的右值會被直接儲存到棧中,而物件 ( 引用型別的例項 ) 不會,因為 cli 不允許在棧上為引用型別的物件分配記憶體,而只是將物件的引用儲存到棧上。這類似於將乙個原生c++物件分配在堆上並將乙個指向它的指標儲存在棧中。請在閱讀本文的時候記住這個棧的存在,這將有助於理解為什麼數值會不停地在棧上壓入彈出。 

下一步是要讓使用者輸入相加的數值。

ldstr "first number: "

call void [mscorlib]system.console::write(string)

call string [mscorlib]system.console::readline()

call int32 [mscorlib]system.int32::parse(string)

stloc first

接下來,我們使用add指令完成加法並將結果儲存到變數 result 。 

ldloc first

ldloc second

add

stloc result

最後顯示結果。

ldstr " + = "

ldloc first

box int32

ldloc second

box int32

ldloc result

box int32

call void [mscorlib]system.console::writeline(string, object, object, object)

我們使用writeline 的乙個過載版本,它接收乙個格式化字串和三個 object 物件作為引數。呼叫之前,每乙個引數都必須按順序壓棧。因為數值是以 int32 這個值型別來儲存的,所以我們需要對其進行裝箱操作,否則將無法匹配方法簽名。ldloc指令將每乙個引數壓棧,隨後box指令被應用於每個引數。裝箱操作將數值彈棧,而後構造乙個包含該數值拷貝的新物件,並將新物件的引用壓棧。

完整地程式如下:

.method static void main()

+ = "

ldloc first

box int32

ldloc second

box int32

ldloc result

box int32

call void [mscorlib]system.console::writeline(string, object, object, object)??? 

ret

} 最後值得注意的是,本例中的程式需要大小為4的棧空間,因為最後呼叫 writeline 方法時需要傳入4個引數。

Web API 第二部分

web api 第二部分 元素偏移量 offset element.offsettop element.offsetleft element.offsetwidth 可以得到元素的大小 寬度和高度 是包含padding border width element.offsetheight elemen...

redux 第二部分

redux 的使用方法,為什麼使用 action.js 檔案,進行優化 將其分開,然後我們通過工廠函式的每次返回不同的物件,由於引數是固定的,每次返回的都是事件型別和事件資料,所以我們可以使用乙個函式,通過其返回值來返回乙個物件,讓後傳遞給 action 我們的 reducer 函式有兩個引數,引數...

實驗二 第二部分

第二部分 ftp協議分析 1.兩個同學一組,a和b。2.在a主機上架設ftp伺服器 3.在b主機上執行wireshark,並登陸a主機的ftp伺服器,上傳一張,得到抓取的資料報,4.進行追蹤tcp流,顯示為原始資料,分析得到a主機登陸ftp的過程及使用者名稱密碼,還原上傳的,第二部分 ftp協議分析...