Сейчас на форуме: asfa, bartolomeo (+7 невидимых)

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

Ранг: 2.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 октября 2011 15:56
· Личное сообщение · #1

Дизасмнул длл-ку написаную на с++. Пытаюсь разобраться что к чему, но мешает небольшая непонятка - в функции обыно передаются несколько аргументов и один из них регистром (есх), ида в некоторых вариантах подписала его как this, сразу вспомнилось что в с++ есть "конвенсия" вызова thiscall. Интересно стало что именно передается этим аргументом, мб это указатель на саму "структуру", описатель класса??




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

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

Ага, именно так и есть

-----
Yann Tiersen best and do not fuck




Ранг: 2.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 октября 2011 16:23
· Личное сообщение · #3

спасиб!



Ранг: 2.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 октября 2011 17:08 · Поправил: ASMatic
· Личное сообщение · #4

еще вопосец возник, а можно както заюзать класс из сторонней длл, т.е. сделать new ток на сишке)
если конкретней, есть дл, в ней есть класс который делает нужную мне работу. Думал найти его (указатель на функи) и заюзать, но этот есх не дает.
Собственно вообще не могу найти где в коде делается new для этого класса(


*может класс унаследован и потому нету оператора new для этого класса в поиске иды? Как тогда в таком случае можно поискать кто унаследовал?

**еще было бы хорошо подсказать чот по поводу конструктора класса, как его можно узнать среди остального кода?



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 29 октября 2011 18:03
· Личное сообщение · #5

ASMatic
я делаю так - ищу VMT класса, потом все xrefs на VMT, потом перебираю все по одной и анализирую код. Конструктор видно на глаз - инициализация мемберов, зануление и т.д

| Сообщение посчитали полезным: Hexxx


Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 29 октября 2011 18:25 · Поправил: OKOB
· Личное сообщение · #6

ASMatic пишет:
не могу найти где в коде делается new для этого класса


А кто сказал, что объект класса создается динамически.

Если глобальный статический объект, то в сегменте памяти, если локальный статический, то в стеке место отводится и в конструктор передастся через ECX соответствующий адрес для инициализации объекта.

Вот в параллельной ветке http://exelab.ru/f/action=vthread&forum=5&topic=19180 - явно глобальный статический объект - mov ecx, offset _object
если локальный статический, то - lea ecx, [esp+XXXh]
если динамический, то - mov ecx, eax (вблизи new) или mov eax, [esp+XXXh] (если выделение памяти было чуть выше по коду)

-----
127.0.0.1, sweet 127.0.0.1


| Сообщение посчитали полезным: Hexxx

Ранг: 2.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 30 октября 2011 14:47 · Поправил: ASMatic
· Личное сообщение · #7

sendersu,OKOB - спасиб, подразобрался.
выходит что мой класс толи унаследован, толи виртуальный - сам себе в ините аллочит память и инициализирует её. А инит вызывает другой класс и в его VMT уже есть указатель на VMT моего класса.



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

Создано: 17 февраля 2012 21:32
· Личное сообщение · #8

<<может класс унаследован и потому нету оператора new для этого класса
Сивый бред, сами то хоть понимаете, что несёте... Вы считаете, что плюсовым разрабам стандартом поставлен запрет на создание объектов подклассов в динамической памяти? Клёвый прикол! Если вы знакомы с плюсами, то должны представлять себе такие элементарные понятия, как "Виртуальный конструктор", "Фабричная функция", которые базируются на создании в куче объектов подклассов, имеющих общий суперкласс или Вы вообще в плюсах не бум-бум?



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 17 февраля 2012 21:41 · Поправил: Hexxx
· Личное сообщение · #9

TheNozza пишет:
Если вы знакомы с плюсами, то должны представлять себе такие элементарные понятия, как "Виртуальный конструктор", "Фабричная функция"

Ага в разделе "для новичков" И кстати для программирования на плюсах не обязательно знать вот эти элементарные понятия

TheNozza пишет:
Сивый бред, сами то хоть понимаете, что несёте

На самом деле не бред. Может быть класс, экземпляр которого в коде программы не создается, поэтому нет для него new. Вариант про создание в стеке уже описал OKOB, не рассматриваем. Так вот сам по себе он не создается, но является членом другого класса (агрегация). Или просто обычное наследование. Тогда new будет вызвано для потомка, а для предка просто конструктор. Если человек смотрит на конструктор предка, то он не увидит рядом new.

-----
Реверсивная инженерия - написание кода идентичного натуральному




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

Создано: 17 февраля 2012 22:05
· Личное сообщение · #10

Просто поправка: Экземпляр - Instance (Инстанс), этот термин предпочтительнее.
<<Так вот сам по себе он не создается, но является членом другого класса (агрегация).
Если объект класса является членом другого класса, то это композиция, а не агрегация, т.к. в этом случае время жизни обоих объектов будет одинаково и один не сможет существовать без другого - не говори о том чего не знаешь, почитай об иерархиях part-of.

<<класс экземпляр, которого в коде программы не создается
Чтобы заюзать фичи такого класса (а это единственная цель по которой новой класс проектируется и реализуется), у него интерфейсные методы должны быть статическими.

<<Так вот сам по себе он не создается, но является членом другого класса
Бред такое не возможно. Членами классов могут являться Instance других классов, но не сами классы, т.к. класс - это тип.



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

Создано: 17 февраля 2012 22:21
· Личное сообщение · #11

<<Тогда new будет вызвано для потомка, а для предка просто конструктор.
Что за термины потомок, предок? В школе что ли? Подкласс и суперкласс для серьёзных или по проще производный, базовый для студентов.

Ты опять бредишь... Если через new создаётся объект производного класса, то ты считаешь, что new вызовет конструктор лишь для базового класса и все поля у объекта производного класса останутся непроинициализированными??? в связи с тем, что new забыл вызвать для него конструктор?



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

Создано: 17 февраля 2012 23:09
· Личное сообщение · #12

Hexxx
<<И кстати для программирования на плюсах не обязательно знать вот эти элементарные понятия

Можно разделить программирование на плюсах на две категории:
1) Любительское (С++ - хобби для души) - ответ: необязательно, т.к. эти вещи довольно глубокие
2) Профессиональное (источник доходов) - ответ: Обязательно

Если хотите отличить профессионала от любителя (например среди знакомых, друзей), то задайте один вопрос: "Что такое виртуальный деструктор?" Любитель об этом навряд ли слышал, т.к. в книгах по си++ маловероятно, что он это найдёт. Профессионал, ответит сразу, т.к. не один класс, выступающий в роли базового не пройдёт CODE REVIEW, в том случае, если он не имеет виртуального деструктора.

Такова жизнь. Всё просто друзья!




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 17 февраля 2012 23:19
· Личное сообщение · #13

Да хорош уже с самим собой разговаривать. Поднял топик полугодовой давности и разогнался. Это форум не для профессиональных кодеров на плюсах в любом случае. И да, пользуйся кнопкой "Правка", не создавай сообщения подряд.



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

Создано: 18 февраля 2012 01:41 · Поправил: TheNozza
· Личное сообщение · #14

Archer
<<Это форум не для профессиональных кодеров на плюсах в любом случае.

Не корректно разрабов кодерами обзывать, т.к. задачи у них различные:
1) Проектирование - то бишь разработка UML Class Diagram, UML Sequence Diagram это по Вашему кодинг?
2)Unit testing, выполняющееся разработчиком после прохождения ревизии кода это тоже кодинг?
Да, Вы батенька просто слабо представляете процесс разработки ПО!



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

Создано: 18 февраля 2012 02:15
· Личное сообщение · #15

OKOB
<<Если глобальный статический объект, то в сегменте памяти, если локальный статический, то в стеке место отводится

На понт лохов берёшь?

Code:
  1. int foo()
  2. {
  3. ...
  4.  static int value =10; //local static variable
  5. return (value);
  6. 004113BE  mov         eax, dword ptr ds:[00417014h]  
  7. }





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 18 февраля 2012 08:59
· Личное сообщение · #16

TheNozza, какая вы всётаки заноза...
Мало того что некротему поднял, так и гонит тут на многих.
Если так уж интересуют вопросы ПО С++ то вам туда http://programmersforum.ru/
Кароче чую если эту некротему не закроют, то тут начнётся срач(маленький но думаю будет)




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 18 февраля 2012 09:43
· Личное сообщение · #17

Конечно не представляю процесс разработки, я вообще беляшами торгую на вокзале.
Толстый тролль утомил уже, закрою топик. Продолжит в том же духе-пойдёт в бан.


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