Сбой программы при вызове функции из Main

Вероятно, это какая-то ошибка новичка, но я не могу ее найти.

ilasm говорит, что мой код генерирует System.InvalidProgramException, Я обнаружил, что это брошено в тот момент, когда я призываю Fibonacci() - флаг, установленный перед вызовом, записывается в консоль, но другой флаг, помещенный в метод непосредственно перед .locals init нет (из-за исключения).

.assembly extern mscorlib { }
.assembly foo { }

.method public static int32 Fibonacci(int32 n)
{
    .locals init ([0] int32 i, [1] int32 last, [2] int32 prev)

    ldc.i4.0
    ldarg n
    brfalse done

    ldc.i4.1
    dup
    ldarg n 
    sub
    brfalse done

    ldc.i4.2
    stloc i

et1:
    dup
    stloc prev
    add
    stloc last
    ldloc prev
    ldloc last

    ldarg n
    ldloc i
    sub
    brfalse done

    ldloc i
    ldc.i4.1
    add
    stloc i
    br et1

done:
    stloc i
    pop
    ldloc i
    ret
}

.method public static void Main()
{
    .entrypoint

    ldstr "result is: {0}"
    ldstr "enter n: "
    call void [mscorlib]System.Console::Write(string)   
    call string [mscorlib]System.Console::ReadLine()    
    call int32 [mscorlib]System.Int32::Parse(string)
    call int32 Fibonacci(int32)
    box [mscorlib]System.Int32
    call void [mscorlib]System.Console::WriteLine(string,object)
    ret
}

1 ответ

Решение

В случае n == 0 вы берете brfalse ветвь с int в стеке.

Но done Код предполагает другой макет стека:

done:
    stloc i
    pop
    ldloc i
    ret

Похоже, это предполагает 2 элемента, входящих.

Другие вопросы по тегам