Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > исследование работы компилятора VC++


Автор: GSasha 23.3.2008, 20:18
Привет всем!!!
Провожу исследование работы компилятора VC++;
Есть простой код:
Код

void _stdcall TestFunc( int first, int second, int third )
{
    printf( "first: %d. second: %d. third: %d\n", first, second, third );
}

int main(int argc, char* argv[])
{
    int f = 0x01;
    int s = 0x02;
    int t = 0x03;
    
    TestFunc( 0x01, 0x02, 0x03 );
    TestFunc( f, s, t );
    _getch();
    return 0;
}

На TestFunc ставлю брейк и по Alt+8 в дизассемблере вижу такой код
Код


21:       TestFunc( 0x01, 0x02, 0x03 );
004010AD   push        3
004010AF   push        2
004010B1   push        1
004010B3   call        @ILT+0(TestFunc) (00401005)



Хочу понять принцип вызова методов и организацию стека по-подробней;
То что параметры push-ают в стек справа на лево видно из примера но при вызове даного метода второй раз с параметрами 
получается вот такой код
Код


22:       TestFunc( f, s, t );
004010B8   mov         eax,dword ptr [ebp-0Ch]
004010BB   push        eax
004010BC   mov         ecx,dword ptr [ebp-8]
004010BF   push        ecx
004010C0   mov         edx,dword ptr [ebp-4]
004010C3   push        edx
004010C4   call        @ILT+0(TestFunc) (00401005)
23:
24:       _getch();

 дизассемблер

Если кто-то в курсе, проясните и меня smile 

Автор: Daevaorn 23.3.2008, 20:22
А что не понятно?

Автор: GSasha 23.3.2008, 20:30
Что копируется в eax?
Код

004010B8   mov         eax,dword ptr [ebp-0Ch]
004010BB   push        eax


Автор: Daevaorn 23.3.2008, 20:37
Значение локальной переменной.

Советую так же посмотреть на тот асм листинг, который выплёвывает(настраивается в параметрах проекта) сам компилятор. Там есть пояснения.

Автор: bsa 23.3.2008, 20:40
GSasha
[ebp-0C] - это переменная t (находится в стеке)

Автор: GSasha 23.3.2008, 20:44
Можна поконкретней про тот асм листинг, который выплёвывает(настраивается в параметрах проекта) сам компилятор.
Спасибо

Добавлено через 4 минуты и 34 секунды
А стек один для екземпляра приложения или для каждого метода создается новый стек?

Добавлено через 8 минут и 32 секунды
и почему именно [ebp-0c]
Какое назначение ebp?

Автор: Daevaorn 23.3.2008, 20:57
Не знаю какая у вас версия Visual Studio, но как-то так:

Project Properties > C/C+  > Output Files

Автор: MAKCim 23.3.2008, 21:12
GSasha, 
1. вы ошиблись разделом
2. прежде чем, задавать такие вопросы, почитайте что-нибудь по ассемблеру
например С. Зубков "Assembler для DOS, Windows и UNIX"

Автор: GSasha 23.3.2008, 21:15
Ok спасибо! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)