最新版 |
編集中の文章 |
1行目: |
1行目: |
− | '''共通中間言語'''(読み:きょうつうちゅうかんげんご、[[英語]]:Common Intermediate Language、略称:CIL)とは、[[Mono]]および[[.NET Framework]]で用いられる[[アセンブリ言語]]、および[[共通言語基盤]]([[CLI]]、[[.NET]]の[[仮想マシン]])が理解できる架空の[[機械語]]のことである。 | + | '''共通中間言語'''(きょうつうちゅうかんげんご、'''C'''ommon '''I'''ntermediate '''L'''anguage、'''CIL''')とは、[[Mono]]および[[.NET Framework]]で用いられる[[アセンブリ言語]]に類似した仮想マシン語のことである。.NET Frameworkがベータ版だったころまでは「'''M'''icro'''s'''oft '''I'''ntermediate '''L'''anguage」('''MSIL''')として知られており、今なおMSILと呼ぶひとは多い。 |
| | | |
− | [[.NET Framework]]がベータ版だったころまでは「Microsoft Intermediate Language」([[MSIL]])として知られており、今なおMSILと呼ぶひとは多い。
| + | CILは、オブジェクト指向アセンブリ言語であり、かつ完全にスタックベースの言語である。 |
| | | |
− | == コード表現とバイナリイメージ表現 ==
| + | .NET系の[[プログラミング言語]]で書かれた[[ソースコード]]は[[コンパイル]]されてCILに変換される。CIL自体はプラットフォームに依存しない(特定CPUに依存しない)命令セットで構成されている。 |
− | 一般的に「[[中間言語]]」と言えばバイナリ形式。
| + | そのためCILは、理論上ネイティブコードに変換することも、.NET Frameworkの仮想マシンである[[共通言語基盤]]([[CLR]])で実行することもできる。 |
− | だが「共通中間言語」という言葉自体は、[[アセンブリ言語]]([[テキスト]])としての意味も、[[マシン語]]([[バイナリ]])としての意味もあり、非常に曖昧な表現となっている。どちらを表しているかは文脈から読み取る必要がある。
| |
− | | |
− | 紛らわしいのでバイナリ形式のことを「[[マネージドコード]]」もしくは「[[ピュアマネージドコード]]」と呼ぶひともいる。
| |
− | 人によっては「CILコード」と「CILイメージ」で使い分けている人もいる。
| |
− | どれが正解かは知らない。
| |
− | | |
− | なお、このページでは主に[[アセンブリ言語]]としての共通中間言語について記載する。
| |
− | | |
− | == 概要 ==
| |
− | CILは、[[オブジェクト指向]]な[[アセンブリ言語]]であり、かつ完全にスタックベースの言語である。
| |
− | | |
− | [[.NET Framework]]系の[[プログラミング言語]]で書かれた[[ソースコード]]は、各種[[コンパイラ]]で[[コンパイル]]されてCILイメージに変換される。
| |
− | | |
− | CIL自体は特定のプラットフォームに依存しない(特定CPUに依存しない)命令セットで構成されている。そのため理論上は、直接[[ネイティブコード]]に変換することも([[Mono]]では実験的に可能)、[[.NET Framework]]の[[仮想マシン]]である[[共通言語基盤]]([[CLI]])で実行することもできる。
| |
− | | |
− | [[MonoDevelop]]では、この[[アセンブリ言語]]を使ったプロジェクトを作れる。
| |
− | 誰得。
| |
| | | |
| == 使用例 == | | == 使用例 == |
− | CILコードによる「[[Hello, world]]」[[プログラム]]の例。
| + | CILによる「[[Hello, world]]」プログラムの例。 |
| <source lang="cil"> | | <source lang="cil"> |
− | // classとかオブジェクト指向な感じだね
| + | .method public static void Main() cil managed |
− | .class private auto ansi beforefieldinit AppMain | |
− | extends [mscorlib]System.Object
| |
| { | | { |
− | // C#みたいな感じでコメントも書けるよ
| + | .entrypoint |
− | .method public static hidebysig | + | .maxstack 1 |
− | default void Main(string[] args) cil managed
| + | ldstr "hello, world" |
− | { | + | call void [mscorlib]System.Console::WriteLine(string) |
− | // どうみてもエントリポイント
| + | ret |
− | .entrypoint
| |
− | .maxstack 8
| |
− | ldstr "hello, world"
| |
− | call void class [mscorlib]System.Console::WriteLine(string)
| |
− | ret
| |
− | }
| |
| } | | } |
| </source> | | </source> |
| | | |
| == CILの命令セット == | | == CILの命令セット == |
− | {| class="wikitable sortable"
| |
− | |+
| |
− | ! style="" | コード
| |
− | ! style="" | 命令
| |
− | ! style="" | 概要
| |
− | |-
| |
− | | 0x58
| |
− | | [[共通中間言語/add|add]]
| |
− | | 2つの値を加算し、新しい値を返す
| |
− | |-
| |
− | | 0xD6
| |
− | | [[共通中間言語/add.ovf|add.ovf]]
| |
− | | 2つの符号付き整数値を加算し、かつオーバーフローのチェックを行い、新しい値を返す。
| |
− | |-
| |
− | | 0xD7
| |
− | | [[共通中間言語/add.ovf.un|add.ovf.un]]
| |
− | | 2つの符号なし整数値を加算し、かつオーバーフローのチェックを行い、新しい値を返す。
| |
− | |-
| |
− | | 0x5F
| |
− | | [[共通中間言語/and|and]]
| |
− | | 2つの値のビットごとのANDを計算し、新しい値を返す。
| |
− | |-
| |
− | | 0xFE 0x00
| |
− | | [[共通中間言語/arglist|arglist]]
| |
− | | 現在のメソッドの引数リストのハンドル(アンマネージポインター)を返す。
| |
− | |-
| |
− | | 0x3B <int32>
| |
− | | [[共通中間言語/beq|beq]] target
| |
− | | 2つの値が等しいときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x2E <int8>
| |
− | | [[共通中間言語/beq.s|beq.s]] target
| |
− | | 2つの値が等しいときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x3C <int32>
| |
− | | [[共通中間言語/bge|bge]] target
| |
− | | 値1が値2より大きいまたは等しいときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x2E <int8>
| |
− | | [[共通中間言語/bge.s|bge.s]] target
| |
− | | 値1が値2より大きいまたは等しいときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x41 <int32>
| |
− | | [[共通中間言語/bge.un|bge.un]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1が値2より大きいまたは等しいときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x34 <int8>
| |
− | | [[共通中間言語/bge.un.s|bge.un.s]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1が値2より大きいまたは等しいときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x3D <int32>
| |
− | | [[共通中間言語/bgt|bgt]] target)
| |
− | | 値1が値2より大きいときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x30 <int8>
| |
− | | [[共通中間言語/bgt.s|bgt.s]] target
| |
− | | 値1が値2より大きいときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x42 <int32>
| |
− | | [[共通中間言語/bgt.un|bgt.un]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1が値2より大きいときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x35 <int8>
| |
− | | [[共通中間言語/bgt.un.s|bgt.un.s]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1が値2より大きいときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x3E <int32>
| |
− | | [[共通中間言語/ble|ble]] target
| |
− | | 値1が値2より小さいまたは等しいときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x31 <int8>
| |
− | | [[共通中間言語/ble.s|ble.s]] target
| |
− | | 値1が値2より小さいまたは等しいときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x43 <int32>
| |
− | | [[共通中間言語/ble.un|ble.un]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1が値2より小さいまたは等しいときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x36 <int8>
| |
− | | [[共通中間言語/ble.un.s|ble.un.s]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1が値2より小さいまたは等しいときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x3F <int32>
| |
− | | [[共通中間言語/blt|blt]] target
| |
− | | 値1が値2より小さいときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x32 <int8>
| |
− | | [[共通中間言語/blt.s|blt.s]] target
| |
− | | 値1が値2より小さいときに、targetへ処理を移す。。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x44 <int32>
| |
− | | [[共通中間言語/blt.un|blt.un]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1が値2より小さいときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x37 <int8>
| |
− | | [[共通中間言語/blt.un.s|blt.un.s]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1が値2より小さいときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x40 <int32>
| |
− | | [[共通中間言語/bne.un|bne.un]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1と値2が等しくないときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x33 <int8>
| |
− | | [[共通中間言語/bne.un.s|bne.un.s]] target
| |
− | | 符号なし整数値または順序なし(浮動小数点)を比較し、値1と値2が等しくないときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x8C <T>
| |
− | | [[共通中間言語/box|box]] <valTypeToken>
| |
− | | 値型をオブジェクト参照に変換する。
| |
− | |-
| |
− | | 0x38 <int32>
| |
− | | [[共通中間言語/br|br]] target
| |
− | | 無条件で、targetへ処理を移す。
| |
− | |-
| |
− | | 0x2B <int8>
| |
− | | [[共通中間言語/br.s|br.s]] target
| |
− | | 無条件で、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x01
| |
− | | [[共通中間言語/break|break]]
| |
− | | ブレイクポイントに達したことをデバッガーに通知する。
| |
− | |-
| |
− | | 0x39 <int32>
| |
− | | [[共通中間言語/brfalse|brfalse]] target
| |
− | | 値がfalseまたはnullまたはゼロのときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x2C <int8>
| |
− | | [[共通中間言語/brfalse.s|brfalse.s]] target
| |
− | | 値がfalseまたはnullまたはゼロのときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x3A <int32>
| |
− | | [[共通中間言語/brinst|brinst]] target
| |
− | | 値がnullでもゼロでもないときに、targetへ処理を移す。(brtrueの別名)
| |
− | |-
| |
− | | 0x2D <int8>
| |
− | | [[共通中間言語/brinst.s|brinst.s]] target
| |
− | | 値がnullでもゼロでもないときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。(brtrue.sの別名)
| |
− | |-
| |
− | | 0x39 <int32>
| |
− | | [[共通中間言語/brnull|brnull]] target
| |
− | | 値がnullのときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x2C <int8>
| |
− | | [[共通中間言語/brnull.s|brnull.s]] target
| |
− | | 値がnullのときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x3A <int32>
| |
− | | [[共通中間言語/brtrue|brtrue]] target
| |
− | | 値がnullでもゼロでもないときに、targetへ処理を移す。
| |
− | |-
| |
− | | 0x2D <int8>
| |
− | | [[共通中間言語/brtrue.s|brtrue.s]] target
| |
− | | 値がnullでもゼロでもないときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x39 <int32>
| |
− | | [[共通中間言語/brzero|brzero]] target
| |
− | | 値がfalseまたはnullまたはゼロのときに、targetへ処理を移す。(brfalseの別名)
| |
− | |-
| |
− | | 0x2C <int8>
| |
− | | [[共通中間言語/brzero.s|brzero.s]] target
| |
− | | 値がfalseまたはnullまたはゼロのときに、targetへ処理を移す。飛び先がint8の範囲内のとき用。(brfalse.sの別名)
| |
− | |-
| |
− | | 0x28 <T>
| |
− | | [[共通中間言語/call|call]] methodDesc
| |
− | | methodDescに書かれたメソッドを呼び出す。
| |
− | |-
| |
− | | 0x29 <T>
| |
− | | [[共通中間言語/calli|calli]] callSiteDescr
| |
− | | callSiteDescrで引数の型を指定し、事前にftnで指定したメソッド(評価スタックに積まれてる関数ポインタ)を呼び出す。
| |
− | |-
| |
− | | 0x6F <T>
| |
− | | [[共通中間言語/callvirt|callvirt]] method
| |
− | | オブジェクトの遅延評価メソッドを呼び出し、戻り値を評価スタックに積む。
| |
− | |-
| |
− | | 0x74 <T>
| |
− | | [[共通中間言語/castclass|castclass]] class
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x01
| |
− | | [[共通中間言語/ceq|ceq]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x02
| |
− | | [[共通中間言語/cgt|cgt]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x03
| |
− | | [[共通中間言語/cgt.un|cgt.un]]
| |
− | |
| |
− | |-
| |
− | | 0xC3
| |
− | | [[共通中間言語/ckfinite|ckfinite]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x04
| |
− | | [[共通中間言語/clt|clt]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x05
| |
− | | [[共通中間言語/clt.un|clt.un]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x16 <T>
| |
− | | [[共通中間言語/constrained.|constrained.]] thisType
| |
− | |
| |
− | |-
| |
− | | 0xD3
| |
− | | [[共通中間言語/conv.i|conv.i]]
| |
− | |
| |
− | |-
| |
− | | 0x67
| |
− | | [[共通中間言語/conv.i1|conv.i1]]
| |
− | |
| |
− | |-
| |
− | | 0x68
| |
− | | [[共通中間言語/conv.i2|conv.i2]]
| |
− | |
| |
− | |-
| |
− | | 0x69
| |
− | | [[共通中間言語/conv.i4|conv.i4]]
| |
− | |
| |
− | |-
| |
− | | 0x6A
| |
− | | [[共通中間言語/conv.i8|conv.i8]]
| |
− | |
| |
− | |-
| |
− | | 0xD4
| |
− | | [[共通中間言語/conv.ovf.i|conv.ovf.i]]
| |
− | |
| |
− | |-
| |
− | | 0x8A
| |
− | | [[共通中間言語/conv.ovf.i.un|conv.ovf.i.un]]
| |
− | |
| |
− | |-
| |
− | | 0xB3
| |
− | | [[共通中間言語/conv.ovf.i1|conv.ovf.i1]]
| |
− | |
| |
− | |-
| |
− | | 0x82
| |
− | | [[共通中間言語/conv.ovf.i1.un|conv.ovf.i1.un]]
| |
− | |
| |
− | |-
| |
− | | 0xB5
| |
− | | [[共通中間言語/conv.ovf.i2|conv.ovf.i2]]
| |
− | |
| |
− | |-
| |
− | | 0x83
| |
− | | [[共通中間言語/conv.ovf.i2.un|conv.ovf.i2.un]]
| |
− | |
| |
− | |-
| |
− | | 0xB7
| |
− | | [[共通中間言語/conv.ovf.i4|conv.ovf.i4]]
| |
− | |
| |
− | |-
| |
− | | 0x84
| |
− | | [[共通中間言語/conv.ovf.i4.un|conv.ovf.i4.un]]
| |
− | |
| |
− | |-
| |
− | | 0xB9
| |
− | | [[共通中間言語/conv.ovf.i8|conv.ovf.i8]]
| |
− | |
| |
− | |-
| |
− | | 0x85
| |
− | | [[共通中間言語/conv.ovf.i8.un|conv.ovf.i8.un]]
| |
− | |
| |
− | |-
| |
− | | 0xD5
| |
− | | [[共通中間言語/conv.ovf.u|conv.ovf.u]]
| |
− | |
| |
− | |-
| |
− | | 0x8B
| |
− | | [[共通中間言語/conv.ovf.u.un|conv.ovf.u.un]]
| |
− | |
| |
− | |-
| |
− | | 0xB4
| |
− | | [[共通中間言語/conv.ovf.u1|conv.ovf.u1]]
| |
− | |
| |
− | |-
| |
− | | 0x86
| |
− | | [[共通中間言語/conv.ovf.u1.un|conv.ovf.u1.un]]
| |
− | |
| |
− | |-
| |
− | | 0xB6
| |
− | | [[共通中間言語/conv.ovf.u2|conv.ovf.u2]]
| |
− | |
| |
− | |-
| |
− | | 0x87
| |
− | | [[共通中間言語/conv.ovf.u2.un|conv.ovf.u2.un]]
| |
− | |
| |
− | |-
| |
− | | 0xB8
| |
− | | [[共通中間言語/conv.ovf.u4|conv.ovf.u4]]
| |
− | |
| |
− | |-
| |
− | | 0x88
| |
− | | [[共通中間言語/conv.ovf.u4.un|conv.ovf.u4.un]]
| |
− | |
| |
− | |-
| |
− | | 0xBA
| |
− | | [[共通中間言語/conv.ovf.u8|conv.ovf.u8]]
| |
− | |
| |
− | |-
| |
− | | 0x89
| |
− | | [[共通中間言語/conv.ovf.u8.un|conv.ovf.u8.un]]
| |
− | |
| |
− | |-
| |
− | | 0x76
| |
− | | [[共通中間言語/conv.r.un|conv.r.un]]
| |
− | |
| |
− | |-
| |
− | | 0x6B
| |
− | | [[共通中間言語/conv.r4|conv.r4]]
| |
− | |
| |
− | |-
| |
− | | 0x6C
| |
− | | [[共通中間言語/conv.r8|conv.r8]]
| |
− | |
| |
− | |-
| |
− | | 0xE0
| |
− | | [[共通中間言語/conv.u|conv.u]]
| |
− | |
| |
− | |-
| |
− | | 0xD2
| |
− | | [[共通中間言語/conv.u1|conv.u1]]
| |
− | |
| |
− | |-
| |
− | | 0xD1
| |
− | | [[共通中間言語/conv.u2|conv.u2]]
| |
− | |
| |
− | |-
| |
− | | 0x6D
| |
− | | [[共通中間言語/conv.u4|conv.u4]]
| |
− | |
| |
− | |-
| |
− | | 0x6E
| |
− | | [[共通中間言語/conv.u8|conv.u8]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x17
| |
− | | [[共通中間言語/cpblk|cpblk]]
| |
− | |
| |
− | |-
| |
− | | 0x70 <T>
| |
− | | [[共通中間言語/cpobj|cpobj]] classTok
| |
− | |
| |
− | |-
| |
− | | 0x5B
| |
− | | [[共通中間言語/div|div]]
| |
− | |
| |
− | |-
| |
− | | 0x5C
| |
− | | [[共通中間言語/div.un|div.un]]
| |
− | |
| |
− | |-
| |
− | | 0x25
| |
− | | [[共通中間言語/dup|dup]]
| |
− | |
| |
− | |-
| |
− | | 0xDC
| |
− | | [[共通中間言語/endfault|endfault]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0X11
| |
− | | [[共通中間言語/endfilter|endfilter]]
| |
− | |
| |
− | |-
| |
− | | 0xDC
| |
− | | [[共通中間言語/endfinally|endfinally]]
| |
− | |
| |
− | |-
| |
− | | 0x4C
| |
− | | [[共通中間言語/idind.u8|idind.u8]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x18
| |
− | | [[共通中間言語/initblk|initblk]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x15 <T>
| |
− | | [[共通中間言語/initobj|initobj]] typeTok
| |
− | |
| |
− | |-
| |
− | | 0x75 <T>
| |
− | | [[共通中間言語/isinst|isinst]] class
| |
− | |
| |
− | |-
| |
− | | 0x27 <T>
| |
− | | [[共通中間言語/jmp|jmp]] method
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x09 <uint16>
| |
− | | [[共通中間言語/ldarg|ldarg]] index
| |
− | |
| |
− | |-
| |
− | | 0x02
| |
− | | [[共通中間言語/ldarg.0|ldarg.0]]
| |
− | |
| |
− | |-
| |
− | | 0x03
| |
− | | [[共通中間言語/ldarg.1|ldarg.1]]
| |
− | |
| |
− | |-
| |
− | | 0x04
| |
− | | [[共通中間言語/ldarg.2|ldarg.2]]
| |
− | |
| |
− | |-
| |
− | | 0x05
| |
− | | [[共通中間言語/ldarg.3|ldarg.3]]
| |
− | |
| |
− | |-
| |
− | | 0x0E <uint8>
| |
− | | [[共通中間言語/ldarg.s|ldarg.s]] index
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x0A <uint16>
| |
− | | [[共通中間言語/ldarga|ldarga]] index
| |
− | |
| |
− | |-
| |
− | | 0x0F <uint8>
| |
− | | [[共通中間言語/ldarga.s|ldarga.s]] index
| |
− | |
| |
− | |-
| |
− | | 0x20 <int32>
| |
− | | [[共通中間言語/ldc.i4|ldc.i4]] num
| |
− | | numをInt32型の値とみなしスタックに積む。
| |
− | |-
| |
− | | 0x16
| |
− | | [[共通中間言語/ldc.i4.0|ldc.i4.0]]
| |
− | | 数字の「0」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x17
| |
− | | [[共通中間言語/ldc.i4.1|ldc.i4.1]]
| |
− | | 数字の「1」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x18
| |
− | | [[共通中間言語/ldc.i4.2|ldc.i4.2]]
| |
− | | 数字の「2」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x19
| |
− | | [[共通中間言語/ldc.i4.3|ldc.i4.3]]
| |
− | | 数字の「3」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x1A
| |
− | | [[共通中間言語/ldc.i4.4|ldc.i4.4]]
| |
− | | 数字の「4」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x1B
| |
− | | [[共通中間言語/ldc.i4.5|ldc.i4.5]]
| |
− | | 数字の「5」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x1C
| |
− | | [[共通中間言語/ldc.i4.6|ldc.i4.6]]
| |
− | | 数字の「6」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x1D
| |
− | | [[共通中間言語/ldc.i4.7|ldc.i4.7]]
| |
− | | 数字の「7」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x1E
| |
− | | [[共通中間言語/ldc.i4.8|ldc.i4.8]]
| |
− | | 数字の「8」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x15
| |
− | | [[共通中間言語/ldc.i4.m1|ldc.i4.m1]]
| |
− | | 数字の「-1」をInt32型の値としてスタックに積む。
| |
− | |-
| |
− | | 0x1F <int8>
| |
− | | [[共通中間言語/ldc.i4.s|ldc.i4.s]] num
| |
− | | numをInt32型の値とみなしスタックに積む。numがint8の範囲内のとき用。
| |
− | |-
| |
− | | 0x21 <int64>
| |
− | | [[共通中間言語/ldc.i8|ldc.i8]] num
| |
− | | numをInt64型の値とみなしスタックに積む。
| |
− | |-
| |
− | | 0x22 <float32>
| |
− | | [[共通中間言語/ldc.r4|ldc.r4]] num
| |
− | | numをfloat32型の値とみなしスタックに積む。
| |
− | |-
| |
− | | 0x23 <float64>
| |
− | | [[共通中間言語/ldc.r8|ldc.r8]] num
| |
− | | numをfloat64型の値とみなしスタックに積む。
| |
− | |-
| |
− | | 0xA3 <T>
| |
− | | [[共通中間言語/ldelem|ldelem]] <typeTok>
| |
− | |
| |
− | |-
| |
− | | 0x97
| |
− | | [[共通中間言語/ldelem.i|ldelem.i]]
| |
− | |
| |
− | |-
| |
− | | 0x90
| |
− | | [[共通中間言語/ldelem.i1|ldelem.i1]]
| |
− | |
| |
− | |-
| |
− | | 0x92
| |
− | | [[共通中間言語/ldelem.i2|ldelem.i2]]
| |
− | |
| |
− | |-
| |
− | | 0x94
| |
− | | [[共通中間言語/ldelem.i4|ldelem.i4]]
| |
− | |
| |
− | |-
| |
− | | 0x96
| |
− | | [[共通中間言語/ldelem.i8|ldelem.i8]]
| |
− | |
| |
− | |-
| |
− | | 0x98
| |
− | | [[共通中間言語/ldelem.r4|ldelem.r4]]
| |
− | |
| |
− | |-
| |
− | | 0x99
| |
− | | [[共通中間言語/ldelem.r8|ldelem.r8]]
| |
− | |
| |
− | |-
| |
− | | 0x9A
| |
− | | [[共通中間言語/ldelem.ref|ldelem.ref]]
| |
− | |
| |
− | |-
| |
− | | 0x91
| |
− | | [[共通中間言語/ldelem.u1|ldelem.u1]]
| |
− | |
| |
− | |-
| |
− | | 0x93
| |
− | | [[共通中間言語/ldelem.u2|ldelem.u2]]
| |
− | |
| |
− | |-
| |
− | | 0x95
| |
− | | [[共通中間言語/ldelem.u4|ldelem.u4]]
| |
− | |
| |
− | |-
| |
− | | 0x96
| |
− | | [[共通中間言語/ldelem.u8|ldelem.u8]]
| |
− | |
| |
− | |-
| |
− | | 0x8F <T>
| |
− | | [[共通中間言語/ldelema|ldelema]] class
| |
− | |
| |
− | |-
| |
− | | 0x7B <T>
| |
− | | [[共通中間言語/ldfld|ldfld]] field
| |
− | |
| |
− | |-
| |
− | | 0x7C <T>
| |
− | | [[共通中間言語/ldflda|ldflda]] field
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x06 <T>
| |
− | | [[共通中間言語/ldftn|ldftn]] method
| |
− | |
| |
− | |-
| |
− | | 0x4D
| |
− | | [[共通中間言語/ldind.i|ldind.i]]
| |
− | |
| |
− | |-
| |
− | | 0x46
| |
− | | [[共通中間言語/ldind.i1|ldind.i1]]
| |
− | |
| |
− | |-
| |
− | | 0x48
| |
− | | [[共通中間言語/ldind.i2|ldind.i2]]
| |
− | |
| |
− | |-
| |
− | | 0x4A
| |
− | | [[共通中間言語/ldind.i4|ldind.i4]]
| |
− | |
| |
− | |-
| |
− | | 0x4C
| |
− | | [[共通中間言語/ldind.i8|ldind.i8]]
| |
− | |
| |
− | |-
| |
− | | 0x4E
| |
− | | [[共通中間言語/ldind.r4|ldind.r4]]
| |
− | |
| |
− | |-
| |
− | | 0x4F
| |
− | | [[共通中間言語/ldind.r8|ldind.r8]]
| |
− | |
| |
− | |-
| |
− | | 0x50
| |
− | | [[共通中間言語/ldind.ref|ldind.ref]]
| |
− | |
| |
− | |-
| |
− | | 0x47
| |
− | | [[共通中間言語/ldind.u1|ldind.u1]]
| |
− | |
| |
− | |-
| |
− | | 0x49
| |
− | | [[共通中間言語/ldind.u2|ldind.u2]]
| |
− | |
| |
− | |-
| |
− | | 0x4B
| |
− | | [[共通中間言語/ldind.u4|ldind.u4]]
| |
− | |
| |
− | |-
| |
− | | 0x8E
| |
− | | [[共通中間言語/ldlen|ldlen]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x0C <uint16>
| |
− | | [[共通中間言語/ldloc|ldloc]] index
| |
− | |
| |
− | |-
| |
− | | 0x06
| |
− | | [[共通中間言語/ldloc.0|ldloc.0]]
| |
− | |
| |
− | |-
| |
− | | 0x07
| |
− | | [[共通中間言語/ldloc.1|ldloc.1]]
| |
− | |
| |
− | |-
| |
− | | 0x08
| |
− | | [[共通中間言語/ldloc.2|ldloc.2]]
| |
− | |
| |
− | |-
| |
− | | 0x09
| |
− | | [[共通中間言語/ldloc.3|ldloc.3]]
| |
− | |
| |
− | |-
| |
− | | 0x11 <uint8>
| |
− | | [[共通中間言語/ldloc.s|ldloc.s]] indx
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x0D <uint16>
| |
− | | [[共通中間言語/ldloca|ldloca]] index
| |
− | |
| |
− | |-
| |
− | | 0x12 <uint8>
| |
− | | [[共通中間言語/ldloca.s|ldloca.s]] index
| |
− | |
| |
− | |-
| |
− | | 0x14
| |
− | | [[共通中間言語/ldnull|ldnull]]
| |
− | |
| |
− | |-
| |
− | | 0x71 <T>
| |
− | | [[共通中間言語/ldobj|ldobj]] typeTok
| |
− | |
| |
− | |-
| |
− | | 0x7E <T>
| |
− | | [[共通中間言語/ldsfld|ldsfld]] field
| |
− | |
| |
− | |-
| |
− | | 0x7F <T>
| |
− | | [[共通中間言語/ldsflda|ldsflda]] field
| |
− | |
| |
− | |-
| |
− | | 0x72 <T>
| |
− | | [[共通中間言語/ldstr|ldstr]] mdToken
| |
− | |
| |
− | |-
| |
− | | 0xD0 <T>
| |
− | | [[共通中間言語/ldtoken|ldtoken]] token
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x07 <T>
| |
− | | [[共通中間言語/ldvirtftn|ldvirtftn]] method
| |
− | |
| |
− | |-
| |
− | | 0xDD <int32>
| |
− | | [[共通中間言語/leave|leave]] target
| |
− | |
| |
− | |-
| |
− | | 0xDE <int8>
| |
− | | [[共通中間言語/leave.s|leave.s]] target
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x0F
| |
− | | [[共通中間言語/localloc|localloc]]
| |
− | |
| |
− | |-
| |
− | | 0xC6 <T>
| |
− | | [[共通中間言語/mkrefany|mkrefany]] class
| |
− | |
| |
− | |-
| |
− | | 0x5A
| |
− | | [[共通中間言語/mul|mul]]
| |
− | |
| |
− | |-
| |
− | | 0xD8
| |
− | | [[共通中間言語/mul.ovf|mul.ovf]]
| |
− | |
| |
− | |-
| |
− | | 0xD9
| |
− | | [[共通中間言語/mul.ovf.un|mul.ovf.un]]
| |
− | |
| |
− | |-
| |
− | | 0x65
| |
− | | [[共通中間言語/neg|neg]]
| |
− | | 評価スタックの一番上の値を取り出し、「[[2の補数]]」を計算し、評価スタックに積む。
| |
− | |-
| |
− | | 0x8D <T>
| |
− | | [[共通中間言語/newarr|newarr]] etype
| |
− | | etypeで示される[[型]]の[[配列]]を作成し、その[[参照]]を[[評価スタック]]に積む。
| |
− | |-
| |
− | | 0x73 <T>
| |
− | | [[共通中間言語/newobj|newobj]] ctor
| |
− | | 新しい[[オブジェクト]]または[[値型]]の新しい[[インスタンス]]を作成し、その[[参照]]を[[評価スタック]]に積む。。
| |
− | |-
| |
− | | 0xFE 0x19
| |
− | | [[共通中間言語/no.|no.]] { <code>typecheck</code>, <code>rangecheck</code>, <code>nullcheck]] } [prefix]
| |
− | |
| |
− | |-
| |
− | | 0x00
| |
− | | [[共通中間言語/nop|nop]]
| |
− | | 何もしない。[[エディットコンテニュー]]や[[ブレイクポイント]]を使ったときの穴埋め用。
| |
− | |-
| |
− | | 0x66
| |
− | | [[共通中間言語/not|not]]
| |
− | | 評価スタックの一番上にある値を取り出し、[[ビット]]ごとの[[補数]]([[1の補数]])を計算し、評価スタックに積む。
| |
− | |-
| |
− | | 0x60
| |
− | | [[共通中間言語/or|or]]
| |
− | | 評価スタックの一番上にある2つの値を取り出し、[[ビット]]ごとの[[補数]]を計算し、評価スタックに積む。
| |
− | |-
| |
− | | 0x26
| |
− | | [[共通中間言語/pop|pop]]
| |
− | | スタックの一番上にある値を取り出す。
| |
− | |-
| |
− | | 0xFE 0x1E
| |
− | | [[共通中間言語/readonly.|readonly.]]
| |
− | | 以降の配列アドレス演算で、実行時に型チェックを実行しないこと、および[[可変性]]が制限されたマネージドポインターを返すことを指定する。
| |
− | |-
| |
− | | 0xFE 0x1D
| |
− | | [[共通中間言語/refanytype|refanytype]]
| |
− | |
| |
− | |-
| |
− | | 0xC2 <T>
| |
− | | [[共通中間言語/refanyval|refanyval]] type
| |
− | |
| |
− | |-
| |
− | | 0x5D
| |
− | | [[共通中間言語/rem|rem]]
| |
− | |
| |
− | |-
| |
− | | 0x5E
| |
− | | [[共通中間言語/rem.un|rem.un]]
| |
− | |
| |
− | |-
| |
− | | 0x2A
| |
− | | [[共通中間言語/ret|ret]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x1A
| |
− | | [[共通中間言語/rethrow|rethrow]]
| |
− | | 現在の例外を再スローする。catch ハンドラー内でのみ使える。
| |
− | |-
| |
− | | 0x62
| |
− | | [[共通中間言語/shl|shl]]
| |
− | | 評価スタックから値とシフトするビット数を取り出し、0を使用して左に[[ビットシフト]]([[論理シフト]])し、結果を評価スタックに積む。
| |
− | |-
| |
− | | 0x63
| |
− | | [[共通中間言語/shr|shr]]
| |
− | | 評価スタックから値とシフトするビット数を取り出し、0を使用して右に[[ビットシフト]]([[論理シフト]])し、結果を評価スタックに積む。
| |
− | |-
| |
− | | 0x64
| |
− | | [[共通中間言語/shr.un|shr.un]]
| |
− | | 評価スタックから符号なし整数値とシフトするビット数を取り出し、0を使用して右に[[ビットシフト]]([[論理シフト]])し、結果を評価スタックに積む。
| |
− | |-
| |
− | | 0xFE 0x1C <T>
| |
− | | [[共通中間言語/sizeof|sizeof]] valType
| |
− | | valTypeで指定された[[値型]]のサイズ(バイト数)を算出し、評価スタックに積む。
| |
− | |-
| |
− | | 0xFE 0x0B <uint16>
| |
− | | [[共通中間言語/starg|starg]] num
| |
− | | 評価スタックの一番上にある値を取り出し、numで指定したインデックスの[[引数スロット]]に格納する。
| |
− | |-
| |
− | | 0x10 <uint8>
| |
− | | [[共通中間言語/starg.s|starg.s]] num
| |
− | | 評価スタックの一番上にある値を取り出し、numで指定したインデックスの[[引数スロット]]に格納する。インデックスが8ビット以内のとき用。
| |
− | |-
| |
− | | 0xA4 <T>
| |
− | | [[共通中間言語/stelem|stelem]] typeTok
| |
− | |
| |
− | |-
| |
− | | 0x9B
| |
− | | [[共通中間言語/stelem.i|stelem.i]]
| |
− | |
| |
− | |-
| |
− | | 0x9C
| |
− | | [[共通中間言語/stelem.i1|stelem.i1]]
| |
− | |
| |
− | |-
| |
− | | 0x9D
| |
− | | [[共通中間言語/stelem.i2|stelem.i2]]
| |
− | |
| |
− | |-
| |
− | | 0x9E
| |
− | | [[共通中間言語/stelem.i4|stelem.i4]]
| |
− | |
| |
− | |-
| |
− | | 0x9F
| |
− | | [[共通中間言語/stelem.i8|stelem.i8]]
| |
− | |
| |
− | |-
| |
− | | 0xA0
| |
− | | [[共通中間言語/stelem.r4|stelem.r4]]
| |
− | |
| |
− | |-
| |
− | | 0xA1
| |
− | | [[共通中間言語/stelem.r8|stelem.r8]]
| |
− | |
| |
− | |-
| |
− | | 0xA2
| |
− | | [[共通中間言語/stelem.ref|stelem.ref]]
| |
− | |
| |
− | |-
| |
− | | 0x7D <T>
| |
− | | [[共通中間言語/stfld|stfld]] field
| |
− | |
| |
− | |-
| |
− | | 0xDF
| |
− | | [[共通中間言語/stind.i|stind.i]]
| |
− | |
| |
− | |-
| |
− | | 0x52
| |
− | | [[共通中間言語/stind.i1|stind.i1]]
| |
− | |
| |
− | |-
| |
− | | 0x53
| |
− | | [[共通中間言語/stind.i2|stind.i2]]
| |
− | |
| |
− | |-
| |
− | | 0x54
| |
− | | [[共通中間言語/stind.i4|stind.i4]]
| |
− | |
| |
− | |-
| |
− | | 0x55
| |
− | | [[共通中間言語/stind.i8|stind.i8]]
| |
− | |
| |
− | |-
| |
− | | 0x56
| |
− | | [[共通中間言語/stind.r4|stind.r4]]
| |
− | |
| |
− | |-
| |
− | | 0x57
| |
− | | [[共通中間言語/stind.r8|stind.r8]]
| |
− | |
| |
− | |-
| |
− | | 0x51
| |
− | | [[共通中間言語/stind.ref|stind.ref]]
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x0E <uint16>
| |
− | | [[共通中間言語/stloc|stloc]] index
| |
− | | スタック上の値をインデックス番号indexのローカル変数に取り出す。
| |
− | |-
| |
− | | 0x0A
| |
− | | [[共通中間言語/stloc.0|stloc.0]]
| |
− | | スタック上の値をインデックス番号0のローカル変数に取り出す。
| |
− | |-
| |
− | | 0x0B
| |
− | | [[共通中間言語/stloc.1|stloc.1]]
| |
− | | スタック上の値をインデックス番号1のローカル変数に取り出す。
| |
− | |-
| |
− | | 0x0C
| |
− | | [[共通中間言語/stloc.2|stloc.2]]
| |
− | | スタック上の値をインデックス番号2のローカル変数に取り出す。
| |
− | |-
| |
− | | 0x0D
| |
− | | [[共通中間言語/stloc.3|stloc.3]]
| |
− | | スタック上の値をインデックス番号3のローカル変数に取り出す。
| |
− | |-
| |
− | | 0x13 <uint8>
| |
− | | [[共通中間言語/stloc.s|stloc.s]] index
| |
− | | スタック上の値をインデックス番号indexのローカル変数に取り出す。indexが0~255以内のとき用。
| |
− | |-
| |
− | | 0x81 <T>
| |
− | | [[共通中間言語/stobj|stobj]] class
| |
− | |
| |
− | |-
| |
− | | 0x80 <T>
| |
− | | [[共通中間言語/stsfld|stsfld]] field
| |
− | |
| |
− | |-
| |
− | | 0x59
| |
− | | [[共通中間言語/sub|sub]]
| |
− | |
| |
− | |-
| |
− | | 0xDA
| |
− | | [[共通中間言語/sub.ovf|sub.ovf]]
| |
− | |
| |
− | |-
| |
− | | 0xDB
| |
− | | [[共通中間言語/sub.ovf.un|sub.ovf.un]]
| |
− | |
| |
− | |-
| |
− | | 0x45 <uint32> <int32> ... <int32>
| |
− | | [[共通中間言語/switch|switch]] N, t1...tN
| |
− | | ジャンプテーブルを作り、[[評価スタック]]から取り出した値と一致するインデックスが示すアドレスに飛ぶ。一致するものが無ければ続行する。
| |
− | |-
| |
− | | 0xFE 0x14
| |
− | | [[共通中間言語/tail.|tail.]]
| |
− | | 後続のメソッドが実行される直前に、後続のメソッドの引数を除く、現在のメソッドの[[スタックフレーム]]を削除する。[[末尾呼び出し最適化]]用。
| |
− | |-
| |
− | | 0x7A
| |
− | | [[共通中間言語/throw|throw]]
| |
− | | 現在の[[評価スタック]]にある例外オブジェクトをスローする。
| |
− | |-
| |
− | | 0xFE 0x12 <uint8>
| |
− | | [[共通中間言語/unaligned.|unaligned.]] alignment
| |
− | |
| |
− | |-
| |
− | | 0x79 <T>
| |
− | | [[共通中間言語/unbox|unbox]] valType
| |
− | |
| |
− | |-
| |
− | | 0xA5 <T>
| |
− | | [[共通中間言語/unbox.any|unbox.any]] typeTok
| |
− | |
| |
− | |-
| |
− | | 0xFE 0x13
| |
− | | [[共通中間言語/volatile.|volatile.]]
| |
− | | 後続の命令が使う評価スタック上の値が、[[揮発性]]である(複数の[[スレッド]]によって変更される可能性がある)ことを指定し、ランタイムによるキャッシュなどを禁止させる。
| |
− | |-
| |
− | | 0x61
| |
− | | [[共通中間言語/xor|xor]]
| |
− | | 評価スタックから2つの整数値と取り出し、[[ビット]]ごとの[[排他的論理和]]を計算し、結果を評価スタックに積む。
| |
− | |-
| |
− | |}
| |
− |
| |
− | == 関連ツール ==
| |
− | * [[ilasm]] - [[Mono]]に付属する[[アセンブラ]]
| |
− | * [[monodis]] - [[Mono]]に付属する[[逆アセンブラ]]
| |
| | | |
| == 関連項目 == | | == 関連項目 == |
| * [[Mono]] | | * [[Mono]] |
| * [[.NET Framework]] | | * [[.NET Framework]] |
− | * [[共通言語基盤]]([[Common Language Infrastructure]], [[CLI]])
| |
− | ** [[共通型システム]]([[Common Type System]], [[CTS]])
| |
− | ** [[共通言語仕様]]([[Common Language Specification]], [[CLS]])
| |
− | ** [[仮想実行システム]]([[Virtual Execution System]], [[VES]])
| |
− | ** [[共通中間言語]]([[Common Intermediate Language]], [[CIL]])
| |
− | ** [[基本クラスライブラリ]]([[Base Class Library]], [[BCL]]) - [[マイクロソフト]]の[[Portable Class Libraries]]とほぼ同じような内容。
| |
| | | |
| == 参考文献 == | | == 参考文献 == |
983行目: |
29行目: |
| == 外部リンク == | | == 外部リンク == |
| | | |
− | [[category: プログラミング言語]]
| + | {{stub}} |