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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
#1

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

25.06.2014, 12:44. Просмотров 416. Ответов 16
Метки нет (Все метки)

Здравствуйте нужна ваша помощь в ответе на некоторые вопросы низкоуровневого программирования:
На сколько я понял параметры передаются в функцию в стеке с права на лево, возвращаемый параметр выводиться в 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++
Для каждого класса описать поля, характеризующие объект, и методы, позволяющие заполнять и получать значения каждого из полей. выводить...

Механика - Механика
Скорость тела, движущегося прямолинейно, меняется по закону V=A+Bt+C(t(в квадрате)), где А=1 м/с, В=3 м/с, С=6 м/с. Какое расстояние...

Механика - Механика
Два человека, массами m1=60 кг и m2=70 кг, неподвижно стоят на льду. Первый бросает камень массой 2 кг под углом 30 градусов к горизонту...

Механика -_- - Механика
ааааааааааааааааа!!!! ребята т.Т помогите решыть задачку по прикладной механике . пол задачи решено осталось только найти точки опоры...

механика - Механика
помогите пожалуйста решить) Шар массой m1=2 кг сталкивается с покоящимся шаром большей массы и при этом теряет 40% кинетической энергии....

механика - Механика
Определить момент инерции тонкого однородного стержня, если ось вращения проходит через один из его концов.(масса стержня 500 г, длинна-34...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.06.2014, 14:08     Механика функций C++ #2
Цитата Сообщение от ZwHook Посмотреть сообщение
то как в функции реализовать асемблировские аля "pushad pushfd" средствами c++?
а зачем если компилятор переведет ващу ф-цию на ассемблер таким образом что после выхода из ф-ции значения регистров не поменяются?
Vourhey
Почетный модератор
6477 / 2252 / 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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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
642 / 563 / 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
Почетный модератор
6477 / 2252 / 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
Почетный модератор
6477 / 2252 / 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
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
26.06.2014, 19:07     Механика функций C++ #12
Цитата Сообщение от ZwHook Посмотреть сообщение
в c++ я так понял тоже ручками(асм вставки)
Зачем? Любая переменная на стеке - считай, указатель на область стека. Дальше работаешь со стеком через указатели на свой страх и риск.
Цитата Сообщение от ZwHook Посмотреть сообщение
и еще нельзя экспортировать stdcall функцию из длл, а программа внешняя программа подрузамевает что я сам слежу за стеком, тоже ручками(вставкой asm) к esp добавлять ?
Не понял ничего
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
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
Всем спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2014, 20:35     Механика функций C++
Еще ссылки по теме:

Механика - Клавиатуры
Посоветуйте механическую проводную клавиатуру с подсветкой, цифровым блоком и нормальной кнопкой Enter

Задача по механика - Механика
Здравствуйте, помогите разобраться если дано tg\alpha =0,006 тогда чему равно (\sin\alpha+f\cos\alpha)?


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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
26.06.2014, 20:35     Механика функций C++ #15
Цитата Сообщение от ZwHook Посмотреть сообщение
03B6183C C2 0C00 RETN 0xC
вместо
03B6183C C2 RETN
о чем я и говорил
сишное и паскалевское соглашение

вот на будущее
http://ru.wikipedia.org/wiki/Соглашение_о_вызове
Yandex
Объявления
26.06.2014, 20:35     Механика функций C++
Ответ Создать тему
Опции темы

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