Форум программистов, компьютерный форум CyberForum.ru

Механика функций C++ - C++

Восстановить пароль Регистрация
 
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
25.06.2014, 12:44     Механика функций C++ #1
Здравствуйте нужна ваша помощь в ответе на некоторые вопросы низкоуровневого программирования:
На сколько я понял параметры передаются в функцию в стеке с права на лево, возвращаемый параметр выводиться в EAX а стек обслуживает вызывающая программа, то есть правильно ли я понял что если вызывается функция "void test(int a,int b, int c)" то изменения для вызывающей программы в регистрах, флагах и стеках после возвращения из функции не произойдут? если так то вопрос снят, если, что то меняется, то как в функции реализовать асемблировские аля "pushad pushfd" средствами c++?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2014, 12:44     Механика функций C++
Посмотрите здесь:

C++ Шаблоны функций
C++ Шаблоны функций
C++ Функций
C++ Использование функций
C++ Библиотека функций
C++ Перегрузка функций
C++ Вызов функций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.06.2014, 14:08     Механика функций C++ #2
Цитата Сообщение от ZwHook Посмотреть сообщение
то как в функции реализовать асемблировские аля "pushad pushfd" средствами c++?
а зачем если компилятор переведет ващу ф-цию на ассемблер таким образом что после выхода из ф-ции значения регистров не поменяются?
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
25.06.2014, 14:18     Механика функций C++ #3
По поводу изменяемости регистров в cdecl
The volatile registers are: EAX, ECX, EDX, ST0 - ST7, ES and GS
The non-volatile registers are: EBX, EBP, ESP, EDI, ESI, CS and DS
DrOffset
6785 / 3996 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
25.06.2014, 14:26     Механика функций C++ #4
Цитата Сообщение от ZwHook Посмотреть сообщение
На сколько я понял параметры передаются в функцию в стеке с права на лево, возвращаемый параметр выводиться в EAX
Строго говоря это не так. Во-первых есть разные конвенции вызова. Во-вторых, компилятор может вообще не делать вызов, а разместить вместо этого тело функции (встроить функцию). В третьих, результат совершенно не обязан быть в EAX.

Добавлено через 3 минуты
Вот еще по теме.
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
25.06.2014, 19:43  [ТС]     Механика функций C++ #5
Нет тут вопрос немного в другом наверно я не правильно выразился, я буду из АСЕМБЛЕРА(точней из сторонней программы), вызывать мою функцию(которая в dll) и передавать ей некоторые параметры программы обрабатывать их, задача в том, что бы после моей функции все регистры, флаги и стек были в первозданном виде как до вызова функции, причем это надо сделать средствами самой функции c++, как это проще реализовать? мне от незнания c++ приходит в голову только asm вставка вначале функции pushad pushfd а в конце popfd popad, но я сомневаюсь что это правильно
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.06.2014, 09:24     Механика функций C++ #6
Цитата Сообщение от ZwHook Посмотреть сообщение
флаги и стек были в первозданном виде как до вызова функции,
они будут расслабтесь, это называется инжект в память)
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
26.06.2014, 17:10  [ТС]     Механика функций C++ #7
Вообщем нет, хренит к чертям регистры которые указал товарищ выше, самая главная проблема при вызове из длл функции, весь стек забивает "cccccccc", есть какая нибудь возможность избежать этого?
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
26.06.2014, 17:33     Механика функций C++ #8
Зачем тебе стек в первозданном виде, если он по сути тебе не доступен нормальными методами ниже указателя стека? Твоих данных там быть не должно. Подпрограмма не должна восстанавливать стек. Указатель на него - да (в случае cdecl).
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
26.06.2014, 18:44  [ТС]     Механика функций C++ #9
просто я из своей программы вызываю подпрограмму, а она может вызвать к примеру call esp +40 и тп
пример вызова
C++
1
2
3
4
5
6
7
typedef void   (_stdcall *callengdec )(LPVOID a,LPVOID b,LPVOID c);
callengdec callengd = ((callengdec)0x203da4d0);
extern "C" __declspec(dllexport) void  readfun(LPVOID a,LPVOID b,LPVOID c)
{
    callengd(a,b,c);    
...
}
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
26.06.2014, 18:49     Механика функций C++ #10
Ну тогда ручками после вызова свой стек на место возвращай.
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
26.06.2014, 19:03  [ТС]     Механика функций C++ #11
да я так и сделал, но в асемблере, в c++ я так понял тоже ручками(асм вставки)?
и еще нельзя экспортировать stdcall функцию из длл, а программа внешняя программа подрузамевает что я сам слежу за стеком, тоже ручками(вставкой asm) к esp добавлять ?
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
26.06.2014, 19:07     Механика функций C++ #12
Цитата Сообщение от ZwHook Посмотреть сообщение
в c++ я так понял тоже ручками(асм вставки)
Зачем? Любая переменная на стеке - считай, указатель на область стека. Дальше работаешь со стеком через указатели на свой страх и риск.
Цитата Сообщение от ZwHook Посмотреть сообщение
и еще нельзя экспортировать stdcall функцию из длл, а программа внешняя программа подрузамевает что я сам слежу за стеком, тоже ручками(вставкой asm) к esp добавлять ?
Не понял ничего
ValeryS
Модератор
6407 / 4873 / 447
Регистрация: 14.02.2011
Сообщений: 16,170
26.06.2014, 19:15     Механика функций C++ #13
Цитата Сообщение от ZwHook Посмотреть сообщение
а она может вызвать к примеру call esp +40 и тп
покаж
не разу такого не встречал
Цитата Сообщение от ZwHook Посмотреть сообщение
хренит к чертям регистры которые указал товарищ выше, самая главная проблема при вызове из длл функции, весь стек забивает "cccccccc",
соглашения о вызовах соблюдаешь?
Паскалевская функция сама очищает стек от аргументов
Сишная не чистит чистит вызывающая сторона


Цитата Сообщение от DrOffset Посмотреть сообщение
В третьих, результат совершенно не обязан быть в EAX.
да он может быть в EDX EAX разумеется речь идет о 80386 и выше
например в ARM нет EAX там другие соглашения

рекомендую книгу К. Касперский "Техника отладки программ без исходных кодов"
там целая глава посвящена функциям и какие соглашения о вызовах у разных компиляторов
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
26.06.2014, 20:11  [ТС]     Механика функций C++ #14
блин боролся путем вставок понял что это тупняк, тк все равно в конце программы выполняется неуправляемый код который все портит, а писать статический выход не вариант тк при любых изменениях кода придется переделывать, выход, решено было для правильного esp использовать вызов stdcall и getproc... вписали имя _readfun@12 и ура все заработала, стока гемора, думал функция в асме будет в корне изменена, а вот хрен там плавал, изменился только ретурн:
03B6183C C2 0C00 RETN 0xC
вместо
03B6183C C2 RETN
Всем спасибо.
ValeryS
Модератор
6407 / 4873 / 447
Регистрация: 14.02.2011
Сообщений: 16,170
26.06.2014, 20:35     Механика функций C++ #15
Цитата Сообщение от ZwHook Посмотреть сообщение
03B6183C C2 0C00 RETN 0xC
вместо
03B6183C C2 RETN
о чем я и говорил
сишное и паскалевское соглашение

вот на будущее
http://ru.wikipedia.org/wiki/Соглашение_о_вызове
DrOffset
6785 / 3996 / 917
Регистрация: 30.01.2014
Сообщений: 6,816
26.06.2014, 22:29     Механика функций C++ #16
Цитата Сообщение от ValeryS Посмотреть сообщение
да он может быть в EDX EAX
Я ссылочку дал на документ, где все подробно расписано что где может быть
И ссылку эту (про соглашение) на википедию, я тоже уже давал

На самом деле ответ на вопрос ТС был в том документе, в разделе 7, Function calling conventions.
Нужно было просто внимательно прочитать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2014, 22:36     Механика функций C++
Еще ссылки по теме:

Использование функций. C++
прототипы функций C++
Объекты класса (математика, физика, программирование, линейная алгебра, математический анализ, теоретическая механика)) C++
C++ Перегрузка функций
Шаблоны функций C++ C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6407 / 4873 / 447
Регистрация: 14.02.2011
Сообщений: 16,170
26.06.2014, 22:36     Механика функций C++ #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Я ссылочку дал на документ, где все подробно расписано что где может быть
ну не заметил
с кем не бывает?
но даже по этой ссылочке выходит
что для целочисленых AX(EAX RAX) главное
для плавающих вершина стека сопра
но я про них как то подзабыл
а вообще такие вопросы абстрактно не решаются , конкретная архитектура и ОСь

я сижу на Винде32 и поэтому про другие хоть и знаю, но не пользуюсь
Нужно будет справочник достанем
Yandex
Объявления
26.06.2014, 22:36     Механика функций C++
Ответ Создать тему
Опции темы

Текущее время: 09:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru