Сейчас на форуме: tyns777, cppasm, dutyfree, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Как передаются аргументы в конструктор класса С++?
Посл.ответ Сообщение

Ранг: 1.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 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 ??



Ранг: 42.2 (посетитель), 42thx
Активность: 0.040
Статус: Участник

Создано: 27 сентября 2016 16:29
· Личное сообщение · #2

госспади , вы же сами написали __thiscall , почитать о соглашениях вызова не ?



Ранг: 1.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 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@

Как передаются указатели на структуры???



Ранг: 42.2 (посетитель), 42thx
Активность: 0.040
Статус: Участник

Создано: 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 - ваши два других аргумента



Ранг: 1.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 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 пишет:
а вообще ваша вежливость конечно просто на высоте .

Моя вежливость или ваше высокомерие или быть может религиозность?



Ранг: 42.2 (посетитель), 42thx
Активность: 0.040
Статус: Участник

Создано: 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.



Ранг: 1.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 27 сентября 2016 17:46
· Личное сообщение · #7

kid пишет:
вот от ваших слов прям разит какой то быдловатостью.

Например где? Про господа ты начал сам писать.
Спасибо я тоже увидел сейчас sub esp, 8 и прочитал про ECX
Вопрос закрыт. Спасибо kid.
PS: Половина форума каких то понторезов тут, судя по жаргону лет 16-ти.


 eXeL@B —› Вопросы новичков —› Как передаются аргументы в конструктор класса С++?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати