Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Знает ли статическая функция о типе своего обьекта, ? 
:(
    Опции темы
Logo
Дата 20.3.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Цитата

Цитата(Logo @  20.3.2012,  16:27 Найти цитируемый пост)
В оригинале как раз указывался регистр, из которого брать адрес (EBP или ESP), а относительно него уже ставился обьект.

Цитата
Код

new(rregs)... 

...  return operator new( sizeof(Scope), (void *)*((long *)&rregs + TSTORED), TSHIFT );    
...  return (Scope*)((char*)ptr - (sizeof(Scope) - TVars::NOTVARS*4) + shift );  


как видно операция размещения ориентированa относительно рассположения в стеке структуры регистров, а не от значений этих регистров.. 
smile


Ну, если присмотрется чуточку повнимательнее, видно, что ориентирована именно относительно значений регистров ;)

Код

return operator new( sizeof(Scope), 
(void *) *(      //3. берем значение, хранящееся по этом адресу
  (long *)&reg + //1. берем адрес структуры регистров
  TSTORED        //2. Увеличиваем указатель на 2 (EBP) или 3 (ESP) элемента
), 
TSHIFT );        //смещение


Аргументы впринципе нет нужды передавать в метод, в данном компиляторе можно как то так:
Код

long _3, _2, _1;
unsigned long __undefided_0[2];
unsigned long __s;
unsigned long __r;
long _asize;

+ добавляем число DWORD'ов снизу структуры, не являющихся переменными (NOTVARS). А вот про регистры забыли.

тогда "20" здесь
Код

addr_as<some_obj> ( regs.ebp - 20 )
addr_as<some_obj> ( regs.ebp - (sizeof(some_obj) - NOTVARS*4) ) //а если у нас ESP, добавить еще и смещение (SHIFT). Его значение легко посмотреть в дизасемблере.


Вобщем код как-то все больше походит на "оригинал" smile
PM MAIL   Вверх
mes
Дата 20.3.2012, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Logo @  20.3.2012,  21:19 Найти цитируемый пост)
Ну, если присмотрется чуточку повнимательнее

это да, сорри.. внимательно не приглядывался.. глаз увидел взятие адреса с регистров, остальное додумал smile

Добавлено через 5 минут и 10 секунд
Цитата(Logo @  20.3.2012,  21:19 Найти цитируемый пост)
Вобщем код как-то все больше походит на "оригинал"

за теми тремя  исключениями с которых и начали.. 
1. нет перегрузки оператора new
2. нет жесткой связки локальных переменных с "координатами" их расположения в стеке
3. нет таинственного определения метода run..

Добавлено через 6 минут и 46 секунд
Цитата(Logo @  20.3.2012,  21:19 Найти цитируемый пост)
Аргументы впринципе нет нужды передавать в метод, в

естесственно стек можно отразить на структуру с любым смещением, если рассположение элементов фиксированно..

Добавлено через 7 минут и 26 секунд
Цитата(Logo @  20.3.2012,  21:19 Найти цитируемый пост)
А вот про регистры забыли.

в смысле забыли, когда они идут основным аргументом  ?

Добавлено через 9 минут и 21 секунду
или про то чтоб их тоже отразить в структуру ? это добавит неповоротливости, так как они соотносятся к срезу, а не к локальным переменым... 



--------------------
PM MAIL WWW   Вверх
Logo
Дата 21.3.2012, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Цитата

2. нет жесткой связки локальных переменных с "координатами" их расположения в стеке

Ну так они же и есть "жестко" связанные, относительно EBP.

Цитата

3. нет таинственного определения метода run..

Там метод называется some_mfn smile

Цитата

Цитата

Аргументы впринципе нет нужды передавать в метод, в

естесственно стек можно отразить на структуру с любым смещением, если рассположение элементов фиксированно..

Ну так относительно EBP оно же всегда фиксированно

Цитата

Цитата

А вот про регистры забыли.

в смысле забыли, когда они идут основным аргументом  ?

Не обрабатываются. Или просто это подразумевалось, что если нам нужны регистры, заменяем
Код

void some_mfn (long a)
some_mfn  ( addr_as<long> (regs.ebp +8)  )
//на
void some_mfn (Regs regs, long a)
some_mfn  ( regs, addr_as<long> (regs.ebp +8)  )

?


Это сообщение отредактировал(а) Logo - 21.3.2012, 16:20
PM MAIL   Вверх
mes
Дата 21.3.2012, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Logo @  21.3.2012,  15:17 Найти цитируемый пост)
Ну так они же и есть "жестко" связанные, относительно EBP.

нет.. в одном стеке можете расположить хоть десять структур / объектов... smile
библиотечную функцию среза вам надо все равно писать, больше ничего лишнего smile
связка стека не прямо и фиксировано отражена на структуру, а  разделена на две части : на описание структур, и их получение..  

Цитата(Logo @  21.3.2012,  15:17 Найти цитируемый пост)
Там метод называется some_mfn 

только вот run во первых таинственен, во вторых один, а в третих с фиксированной сигнатурой.. 
и где ж свобода действий ?!

Цитата(Logo @  21.3.2012,  15:17 Найти цитируемый пост)
Или просто это подразумевалось, что если нам нужны регистры, заменяем

ага ... в функции стыка, мы имеем и регистры и нужные переменные,  а дальше передаем что, куда и как нужно и хочется ..
smile

Добавлено через 6 минут и 55 секунд
Цитата(Logo @  20.3.2012,  21:19 Найти цитируемый пост)
regs.ebp - (sizeof(some_obj) - NOTVARS*4)

эту бы математику желательно тоже абстрагировать.. 



Это сообщение отредактировал(а) mes - 21.3.2012, 17:38


--------------------
PM MAIL WWW   Вверх
Logo
Дата 21.3.2012, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Цитата

нет.. в одном стеке можете расположить хоть десять структур / объектов... 

Ну, для одного конктретного "блока кода", и даже для одной функции, структура локальных переменных/аргументов впринципе фиксированна.

Цитата

во вторых один,

Просто нет необходимости вставлять больше одного "блока кода" в одно конкретное место

Цитата

эту бы математику желательно тоже абстрагировать.. 

В "оригинале" вынесена в шаблон smile
PM MAIL   Вверх
mes
Дата 21.3.2012, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Logo @  21.3.2012,  17:01 Найти цитируемый пост)
Просто нет необходимости вставлять больше одного "блока кода" в одно конкретное место

если в блоке кода всего один лонг, то не зачем создавать структуру.. 
или несколько лонгов на большом или не фиксированом расстоянии друг от друга..

Добавлено @ 18:08
Цитата(Logo @  21.3.2012,  17:01 Найти цитируемый пост)
Просто нет необходимости вставлять больше одного "блока кода" в одно конкретное место

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

Цитата(Logo @  21.3.2012,  17:01 Найти цитируемый пост)
В "оригинале" вынесена в шаблон 

абстрагирована и вынесена  разные понятия..  первое дает свободу действий, а второе лишь прячет проблему..

например это я заменил бы
Код

long & args_ref = addr_as<long> (regs.ebp +8);

 на что то типа :
Код

auto &args_ref = stack_args<long>(regs);
// и stack_vars<> - для переменных

тогда для функции с несколькими аргументами может выглядить, как
Код

auto &args_ref = stack_args<long, double, Class&>(regs);

которая вернет ссылку на кортеж из нескольких элементов.. 

правда auto есть только в C++11.. 

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

Это сообщение отредактировал(а) mes - 21.3.2012, 18:24


--------------------
PM MAIL WWW   Вверх
Logo
Дата 21.3.2012, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Цитата

Цитата

Просто нет необходимости вставлять больше одного "блока кода" в одно конкретное место

например несколько срезов в одной и той же функции..

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

Цитата

или несколько лонгов на большом или не фиксированом расстоянии друг от друга..

На не фиксированом растоянии, такого не бывает, а если растояние большое, в структуре это можно задать так
Код

DWORD __undefined_0[100]; //расстояние 100 двойных слов
...
DWORD __undefined_1[20];  //еще один блок с неопределенными переменными




Это сообщение отредактировал(а) Logo - 21.3.2012, 19:02
PM MAIL   Вверх
mes
Дата 21.3.2012, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Logo @  21.3.2012,  18:01 Найти цитируемый пост)
На не фиксированом растоянии, такого не бывает, 

а как же та ситуация с алокацией памяти ?
  
Цитата(Logo @  21.3.2012,  18:01 Найти цитируемый пост)
в структуре это можно задать так

оно то можно.. но зачем ?  

в общем на данный момент обсуждение превращается  в простой спор.. 
для дальнейшего развития нужна информация, и в частности ситуации,на примере которых можно было бы допилить под нужды.. 
в любом случае я надеюсь Вы согласны, что в сравнение с перегруженым new тот же addr_as или же как его следущий шаг stack_args/_vars  более наглядны и свободны... Так что по сути первоначальная тема исчерпана...  Но с удовольствием продолжил бы, при наличии с вашей стороны интереса по развитию функционала 
smile



--------------------
PM MAIL WWW   Вверх
mes
Дата 21.3.2012, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



пресмотрев последние посты, хочу уточнить, я не против структуры как описания блока..
я против тех способов перечисленных выше... и кажется я понял, в чем состояла ваша задача,
сейчас попробую выправить ваш оригина smile
кстати как называется та часть стека, которая находится между переменными и аргументами ?



--------------------
PM MAIL WWW   Вверх
Logo
Дата 21.3.2012, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Цитата

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

Не нагляднее ли в этом случае в самой функции вызвать еще несколько функций, разбив таким образом.
Ведь фактически код функции = коду блока в исходной программе, который мы дополняем/заменяем (или просто переписываем на C++ smile)

Цитата

Цитата(Logo @  21.3.2012,  18:01 Найти цитируемый пост)
На не фиксированом растоянии, такого не бывает, 

а как же та ситуация с алокацией памяти ?

В этом случае локальные переменные все равно фиксированны, и лежат внизу, а память выделяется выше. Если же понадобится с этой памятью работать, то указатель на нее все равно где-то лежит (очевидно, он должен быть в локальной переменной), в примере он хранится в локальной переменной memory.

Цитата

Вы согласны, что в сравнение с перегруженым new тот же addr_as или же как его следущий шаг stack_args/_vars  более наглядны и свободны...

Ну как посмотреть... с одной стороны, человеку, особенно не очень знакомому с C++, функция addr_as, понятнее, потому что в ее названии отражено, что она делает. С другой стороны оператор "placement new" (new(...) Type), для того в C++ и предназначен, по смыслу он и есть "addres(или аргумент(ы) относительно которых вычисляется адрес) as". То есть это переписывание встроенного оператора C++.
Свободнее, да, можно применять к простым типам, можно, как я понял, обьеденить несколько типов (<long, double, Class&>) хотя я и пока не знаю, не искал, как это сделать.

Еще, об абстракции, вроде new(Regs) Class, или addr_as<Class>(Regs). И то, и другое, будет брать информацию (Регистр (EBP или ESP), смещение) из класса (?). Когда инфу из класса берет его член, это нормально, а когда некая внешняя функция, мне думается, это уже не так хорошо.

Цитата

в общем на данный момент обсуждение превращается  в простой спор.. 

Ну да, местами есть smile



Это сообщение отредактировал(а) Logo - 21.3.2012, 20:43
PM MAIL   Вверх
mes
Дата 21.3.2012, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Logo @  21.3.2012,  19:24 Найти цитируемый пост)
. С другой стороны оператор "placement new" (new(...) Type), 

не совсем.. объснять долго.. покажу примером чуть позже..

Добавлено через 2 минуты и 42 секунды
Цитата(Logo @  21.3.2012,  19:24 Найти цитируемый пост)
Когда инфу из класса берет его член, это нормально, а когда некая внешняя функция, мне думается, это уже не так хорошо.

хорошо все то, что не заставляет напрягаться..  smile в  оригинале мы связаны по рукам и ногам и не можем вмешаться в процесс - это очень плохо.. хотя сама идея заложена интересная (правда я ее не сразу разглядел.. тут сказывается наверно отсутствие опыта в этом направлении ) smile



--------------------
PM MAIL WWW   Вверх
Logo
Дата 21.3.2012, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Цитата

кстати как называется та часть стека, которая находится между переменными и аргументами ?


Там находятся.
Код

; листинг из IDA
-00000008 var_8           dd ?
-00000004 var_4           dd ?
; функция так же может сохранять другие регистры ака push edi; push esi
+00000000  s              db 4 dup(?)  ;сохраненный ESP, обычно если иcпользуется адресация отностительно EBP
                                       ;его может и не быть
+00000004  r              db 4 dup(?)  ;адрес возврата
+00000008 arg1            dd ?
+0000000C arg2            dd ?


Это сообщение отредактировал(а) Logo - 21.3.2012, 20:38
PM MAIL   Вверх
Logo
Дата 21.3.2012, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



В случае GCC 4 на liveworkspace.org, он возможно, еще может добавлять туда пустое место, для выравнивания, трудно сказать точно, код не посмотришь просто так, но зачем то он выделяет еще место.
PM MAIL   Вверх
mes
Дата 21.3.2012, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Logo, я так понимаю для каждого блока опредлен жесто тип адрессации ? и не нужен один и тот же блок с разной адрессацией ?



--------------------
PM MAIL WWW   Вверх
Logo
Дата 21.3.2012, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Я бы даже сказал, для одной функции жестко определен тип адресации (локальные переменные и аргументы). В которой может быть несколько блоков.
Смещение (SHIFT) определено в блоке, так гибче. Регистр относительно которого вычисляется адрес структуры, в "оригинале" тоже определен в блоке, хотя впринципе для одной функции он один.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.