[ILASM] .maxstack の数を増やす

.assembly extern mscorlib { }
.assembly test { }

.method static void Main() cil managed {
    .entrypoint

    ldstr "Windows 2000で"
    call void [mscorlib]System.Console::WriteLine(string)

    br target

    ldstr ".Net 4と"
    call void [mscorlib]System.Console::WriteLine(string)
    
target:
    ldstr "TLS 1.2"
    call void [mscorlib]System.Console::WriteLine(string)
    ret
}
.method public hidebysig
        static void Fuga10 (
          int32 i
    ) cil managed
{
    .maxstack 4
    ret
}
.method public hidebysig
        static void Fuga (
          int32 i
    ) cil managed
{
    .maxstack 9
    ret
}

.method public hidebysig
        static void Fuga2 (
          int32 i
    ) cil managed
{
    // Method begins at RVA 0x2088
    // Code size 9 (0x9)

    .maxstack 4
    stloc.1

    ldloc.1
    ldc.i4.s 0x551
    and

    ldloc.1
    ldc.i4.s 0xaa2
   and
    ldc.i4.s 1
    shr
    or

    ldc.i4.s 3
    mul
    stloc.1
    ldloc.1
    ret
}

サンプルソースコード

.Net 4 の ilasm でアセンブルする。

72 01 00 00 70 28 01 00  00 0A 38 0A 00 00 00 72
1D 00 00 70 28 01 00 00  0A 72 2D 00 00 70 28 01
00 00 0A 2A
?? ?? ?? ??  ?? ?? ?? ?? ?? ?? ?? ??
2A ?? ?? ?? ?? ?? ?? ??  ?? ?? ?? ?? ?? ?? ?? ??
2A ?? ?? ?? ?? ?? ?? ??  ?? ?? ?? ?? ?? ?? ?? ??
0B 07 1F 51 5F 07 1F A2  5F 1F 01 63 60 1F 03 5A
0B 07 2A     
                                   

コード部分
がmain
がFuga10
水色がFuga
黄色がFuga2

ilasm
バイナリエディタで覗いてみた所。

関数は
+00 DWORD 属性っぽい(0x30xx0000)
+04 WORD maxstack
+06 DWORD コード数
+0A DWORD 不明
みたいなヘッダが含まれている。
引数や、返り値、使うインデックスの数などを増やしても変わらないがmaxstackは関数の頭にWORD形式で埋まってることがわかった

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です