MSIL指令及其參數(shù)詳解(ldc指令詮釋篇)
Note that there are special short (and hence more efficient) encodings for the integers -128 through 127, and especially short encodings for -1 through 8. All short encodings push 4 byte integers on the stack. Longer encodings are used for 8 byte integers and 4 and 8 byte floating-point numbers, as well as 4-byte values that do not fit in the short forms. There are three ways to push an 8 byte integer constant onto the stack.
參見:
http://msdn2.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4(vs.71).aspx
ldc指令的語法如下:
ldc.type value
ldc.i4.number
ldc.i4.s number
在第一條語法中,ldc指令加載一個指定類型的常量到stack.
在第二條語法的指令當(dāng)中,ldc指令更加有效.它傳輸一個整型值-1以及0到8之間的整數(shù)給計(jì)算堆棧.當(dāng)我們傳輸-1到計(jì)算堆棧的時候,這條ldc的語法指令又進(jìn)一步演變成為ldc.i4.ml.
這里,截取ECMA的C#標(biāo)準(zhǔn)里面關(guān)于這個指令的完整參考:
Ref:
引用部分來自ECMA關(guān)于CLI部分的說明.如果安裝了.Net Framework SDK1.1的話,可以在這里找到:
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\docs\Partition III CIL.doc
|
Format |
Assembly Format |
Description |
|
20 <int32> |
ldc.i4 num |
Push num of type int32 onto the stack as int32. |
|
21 <int64> |
ldc.i8 num |
Push num of type int64 onto the stack as int64. |
|
22 <float32> |
ldc.r4 num |
Push num of type float32 onto the stack as F. |
|
23 <float64> |
ldc.r8 num |
Push num of type float64 onto the stack as F. |
|
16 |
ldc.i4.0 |
Push 0 onto the stack as int32. |
|
17 |
ldc.i4.1 |
Push 1 onto the stack as int32. |
|
1E |
ldc.i4.8 |
Push 8 onto the stack as int32. |
|
15 |
ldc.i4.m1 |
Push -1 onto the stack as int32. |
|
15 |
ldc.i4.M1 |
Push -1 of type int32 onto the stack as int32 (alias). |
|
1F <int8> |
ldc.i4.s num |
Push num onto the stack as int32, short form. |
Stack里面的傳輸方向:
… à …, num
Description:
The ldc num instruction pushes number num or some constant onto the stack. There are special short encodings for the integers –128 through 127 (with especially short encodings for –1 through 8). All short encodings push 4-byte integers on the stack. Longer encodings are used for 8-byte integers and 4- and 8-byte floating-point numbers, as well as 4-byte values that do not fit in the short forms.
There are three ways to push an 8-byte integer constant onto the stack
1. For constants that shall be expressed in more than 32 bits, use the ldc.i8 instruction.
2. For constants that require 9–32 bits, use the ldc.i4 instruction followed by a conv.i8.
3. For constants that can be expressed in 8 or fewer bits, use a short form instruction followed by a conv.i8.
There is no way to express a floating-point constant that has a larger range or greater precision than a 64-bit IEC 60559:1989 number, since these representations are not portable across architectures.
Ref:引用結(jié)束
從這里,我們可以看到ldc指令極其參數(shù)的完整使用說明.
這里,只是舉一個參數(shù)比較復(fù)雜的例子來說明IL instruction的使用方法,大家可以觸類旁通,將類似的知識使用到其它的計(jì)算堆棧和托管堆指令中去.
另外更多MSIL指令的詳細(xì)用法可以參考ECMA關(guān)于CLI的Reference的第三章.
posted on 2007-10-17 09:06 lbq1221119 閱讀(7002) 評論(6) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號