eXeL@B —› Вопросы новичков —› Как передаются аргументы в конструктор класса С++? |
Посл.ответ | Сообщение |
|
Создано: 27 сентября 2016 15:53 · Личное сообщение · #1 push ecx ; dwTime push nPID.nPID ; nPID or eax, 1 sub esp, 8 mov ecx, offset stru_4512528 ; this mov $S1, eax mov dword ptr math, offset ??_7IExternalSath@@6B@ call Class1 ; вызываем конструктор класса С++ Class1::Class1() void __thiscall Class1::Class1(Class1 *this, struc1 *s1, struc2 *s2, int nPID, unsigned int dwTime) В стеке dwTime и nPID , а где найти Class1 *this, struc1 *s1, struc2 *s2 ?? |
|
Создано: 27 сентября 2016 16:29 · Личное сообщение · #2 |
|
Создано: 27 сентября 2016 16:46 · Поправил: olia64 · Личное сообщение · #3 kid пишет:госспади , вы же сами написали __thiscall , почитать о соглашениях вызова не ? Без Господа никак? Соглашение о вызовах __thiscall используется для функций-членов. Оно по умолчанию используется функциями членами C++, в которых не используются переменные-аргументы. В соглашении о вызовах __thiscall вызываемый метод очищает стек, что невозможно для функций vararg. В архитектуре x86 аргументы отправляются в стек справа налево, причем указатель this передается через регистр ECX, а не помещается в стек. Как в этом соглашении передаются указатели на структуры и классы? Тут вроде все понятно: push ecx ; dwTime push nPID.nPID ; nPID or eax, 1 sub esp, 8 mov ecx, offset stru_4512528 ; this А тут что происходит? mov $S1, eax mov dword ptr math, offset ??_7IExternalSath@@6B@ Как передаются указатели на структуры??? |
|
Создано: 27 сентября 2016 17:10 · Поправил: kid · Личное сообщение · #4 что такое указатель? - DWORD как его передать через стек ? - push DWORD куда ложится указатель на инициализированный класс ? - mov ecx,DWORD olia64 пишет: push ecx ; dwTime push nPID.nPID ; nPID or eax, 1 sub esp, 8 mov ecx, offset stru_4512528 ; this (далее должен быть колл на функу класса условно sub_xxxx) это можно интерпритировать как stru_4512528->sub_xxxx(nPID,dwTime) olia64 пишет: А тут что происходит? mov $S1, eax mov dword ptr math, offset ??_7IExternalSath@@6B@ ну первая инструкция без предыстории мало что говорит , вторая инструкция ложит в память по указателю math указатель на ??_7IExternalSath@@6B@ Добавлено спустя 1 минуту а вообще ваша вежливость конечно просто на высоте . Добавлено спустя 18 минут Прошу прощения не вчитался в заголовок первый пост . sub esp, 8 - ваши два других аргумента |
|
Создано: 27 сентября 2016 17:29 · Личное сообщение · #5 kid пишет: это можно интерпритировать как stru_4512528->sub_xxxx(nPID,dwTime) Нельзя это так интерпретировать, потому что вызов процедуры совершенно четкий void __thiscall Class1::Class1(Class1 *this, struc1 *s1, struc2 *s2, int nPID, unsigned int dwTime) Непонятно как передаются указатели s1 и s2 в общем случае в С++ , как вы заметили __thiscall В стеке только push ecx ; dwTime push nPID.nPID ; nPID Получается, что через регистры. Мне подумалось что есть какой то общий механизм передачи указателей на структуры в __thiscall ведь аргументов могло быть намного больше чем регистров. kid пишет: а вообще ваша вежливость конечно просто на высоте . Моя вежливость или ваше высокомерие или быть может религиозность? |
|
Создано: 27 сентября 2016 17:33 · Личное сообщение · #6 olia64 пишет: Моя вежливость или ваше высокомерие или быть может религиозность? где то было высокомерие ? вот от ваших слов прям разит какой то быдловатостью. вы считаете что вам обязаны все рассказать ? olia64 пишет: Нельзя это так интерпретировать, потому что вызов процедуры совершенно четкий void __thiscall Class1::Class1(Class1 *this, struc1 *s1, struc2 *s2, int nPID, unsigned int dwTime) ну то что вы верите тому что выплюнула IDA как первой инстанции , то считайте что ваших вторых два аргумента - потенциально просто мусор в стеке .(sub esp, 8 - ваши два других аргумента ) olia64 пишет: Получается, что через регистры. Мне подумалось что есть какой то общий механизм передачи указателей на структуры в __thiscall ведь аргументов могло быть намного больше чем регистров. 1. В соглашении о вызове ясно сказано что только ECX и только для указателя на экземпляр класса . 2. И не стоит слепо верить в то что ИДА верно определила соглашение , зачастую это не так . Добавлено спустя 2 минуты и какой нафиг механиз передачи на структуры или просто дворды ??? указатель это дворд ,от того как вы его используете зависит что это , указатель или тупо int , или bool etc. |
|
Создано: 27 сентября 2016 17:46 · Личное сообщение · #7 |
eXeL@B —› Вопросы новичков —› Как передаются аргументы в конструктор класса С++? |
Эта тема закрыта. Ответы больше не принимаются. |