2013-11-22 3 views
1

Использование C#,, Net framework 4.5 notePadildasm и .ldarg - что случилось внутри?

Попытайтесь понять принципы языка CIL (IL). В настоящее время создать 2 простой метод

public static Int32 Add(Int32 a, Int32 b) 
    { 
     return a + b; 
    } 
    public Int32 Add1(Int32 a, Int32 b) 
    { 
     return a + b; 
    } 

После открытия в ildasm.exe получил

ildasm result

Вопрос

Почему в методе Add КСС производить загрузку аргумент в стек 0 и второй в стек 1 - Где используется стек 0 в методе Add1 Или я что-то пропустил?

+0

Не знаете, почему вы называете их «стек 0» и «стек 1». Вы загружаете, например. аргумент 0 * в * стек IL, вы не загружаетесь из стека IL. – svick

+0

Я только начинаю читать о CIL и обнаружил, что в этом случае CIl использовал что-то вроде стека для хранения аргументов. Q-tu аргументов, определяемых '.maxstack 2', поэтому я думаю, что эта команда загружает аргумент в некоторый стек - на самом деле не shure - если я ошибаюсь - пожалуйста, исправьте меня – gbk

+1

Да, CIL на основе стека:' ldarg.1' означает Msgstr "загрузить аргумент 1 и вставить его в стек". Но не имеет смысла говорить «стек 0» так, как вы это делали. – svick

ответ

9

Ваш первый метод получает два аргумента: a (0) и b (1). Ваш второй получает три аргумента: this (0), a (1) и b (2). Даже если вы не используете this, он все еще там.

+0

привет, спасибо! теперь ясно – gbk

+0

другой вопрос - если я использую '.maxstack 2' countig start from 0 - как 0,1,2? – gbk

+0

Это на самом деле удивительно для меня, на языках C++ «это» передается через регистр, обычно 'ecx', в обход стека вообще. – Blindy

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

  • Нет связанных вопросов^_^