2015-12-06 4 views
1

Возможно, это ошибка новобранец, но я не могу ее найти.Программа вылетает при вызове функции от 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 ветвь с междунар в стеке.

Но done код предполагает другое расположение стека:

done: 
    stloc i 
    pop 
    ldloc i 
    ret 

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

+0

Ну правильно, Лемм это исправить - он должен был сделать то же самое, как. следующий блок, который проверяет, является ли n == 1. Но да, авария в любом случае вызвана чем-то другим. –

+0

Нет, это исправлено. Благодаря! –

Смежные вопросы