Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
#1

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

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

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

Механика обобщённых функций
Здравствуйте! Подскажите, пожалуйста, явная функция swapp является перегрузкой...

Механика оптимизации
Вопрос по работе компилятора. При определенных условиях он вырезает из...

Механика работы условия if
В одном из тестов встертилось такое задание: что выведет программа? Вот код ...

Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h
Помогите решить задания: 1.Дано натуральное число n. Найти разность между...

Передача значений функций в главную программу, вызов функций
Здравствуйте! Скорее всего, неправильно передаю значения функциям и в главную...

Объявление функций внутри других функций
Иногда вижу в некоторых исходниках на c объявление функций, внутри main....

16
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
25.06.2014, 14:08 #2
Цитата Сообщение от ZwHook Посмотреть сообщение
то как в функции реализовать асемблировские аля "pushad pushfd" средствами c++?
а зачем если компилятор переведет ващу ф-цию на ассемблер таким образом что после выхода из ф-ции значения регистров не поменяются?
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
25.06.2014, 14:18 #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
1
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
25.06.2014, 14:26 #4
Цитата Сообщение от ZwHook Посмотреть сообщение
На сколько я понял параметры передаются в функцию в стеке с права на лево, возвращаемый параметр выводиться в EAX
Строго говоря это не так. Во-первых есть разные конвенции вызова. Во-вторых, компилятор может вообще не делать вызов, а разместить вместо этого тело функции (встроить функцию). В третьих, результат совершенно не обязан быть в EAX.

Добавлено через 3 минуты
Вот еще по теме.
0
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
25.06.2014, 19:43  [ТС] #5
Нет тут вопрос немного в другом наверно я не правильно выразился, я буду из АСЕМБЛЕРА(точней из сторонней программы), вызывать мою функцию(которая в dll) и передавать ей некоторые параметры программы обрабатывать их, задача в том, что бы после моей функции все регистры, флаги и стек были в первозданном виде как до вызова функции, причем это надо сделать средствами самой функции c++, как это проще реализовать? мне от незнания c++ приходит в голову только asm вставка вначале функции pushad pushfd а в конце popfd popad, но я сомневаюсь что это правильно
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
26.06.2014, 09:24 #6
Цитата Сообщение от ZwHook Посмотреть сообщение
флаги и стек были в первозданном виде как до вызова функции,
они будут расслабтесь, это называется инжект в память)
0
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
26.06.2014, 17:10  [ТС] #7
Вообщем нет, хренит к чертям регистры которые указал товарищ выше, самая главная проблема при вызове из длл функции, весь стек забивает "cccccccc", есть какая нибудь возможность избежать этого?
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
26.06.2014, 17:33 #8
Зачем тебе стек в первозданном виде, если он по сути тебе не доступен нормальными методами ниже указателя стека? Твоих данных там быть не должно. Подпрограмма не должна восстанавливать стек. Указатель на него - да (в случае cdecl).
0
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
26.06.2014, 18:44  [ТС] #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);    
...
}
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
26.06.2014, 18:49 #10
Ну тогда ручками после вызова свой стек на место возвращай.
1
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
26.06.2014, 19:03  [ТС] #11
да я так и сделал, но в асемблере, в c++ я так понял тоже ручками(асм вставки)?
и еще нельзя экспортировать stdcall функцию из длл, а программа внешняя программа подрузамевает что я сам слежу за стеком, тоже ручками(вставкой asm) к esp добавлять ?
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
26.06.2014, 19:07 #12
Цитата Сообщение от ZwHook Посмотреть сообщение
в c++ я так понял тоже ручками(асм вставки)
Зачем? Любая переменная на стеке - считай, указатель на область стека. Дальше работаешь со стеком через указатели на свой страх и риск.
Цитата Сообщение от ZwHook Посмотреть сообщение
и еще нельзя экспортировать stdcall функцию из длл, а программа внешняя программа подрузамевает что я сам слежу за стеком, тоже ручками(вставкой asm) к esp добавлять ?
Не понял ничего
0
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,218
26.06.2014, 19:15 #13
Цитата Сообщение от ZwHook Посмотреть сообщение
а она может вызвать к примеру call esp +40 и тп
покаж
не разу такого не встречал
Цитата Сообщение от ZwHook Посмотреть сообщение
хренит к чертям регистры которые указал товарищ выше, самая главная проблема при вызове из длл функции, весь стек забивает "cccccccc",
соглашения о вызовах соблюдаешь?
Паскалевская функция сама очищает стек от аргументов
Сишная не чистит чистит вызывающая сторона


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

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

вот на будущее
http://ru.wikipedia.org/wiki/Соглашение_о_вызове
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
26.06.2014, 22:29 #16
Цитата Сообщение от ValeryS Посмотреть сообщение
да он может быть в EDX EAX
Я ссылочку дал на документ, где все подробно расписано что где может быть
И ссылку эту (про соглашение) на википедию, я тоже уже давал

На самом деле ответ на вопрос ТС был в том документе, в разделе 7, Function calling conventions.
Нужно было просто внимательно прочитать
1
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,218
26.06.2014, 22:36 #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Я ссылочку дал на документ, где все подробно расписано что где может быть
ну не заметил
с кем не бывает?
но даже по этой ссылочке выходит
что для целочисленых AX(EAX RAX) главное
для плавающих вершина стека сопра
но я про них как то подзабыл
а вообще такие вопросы абстрактно не решаются , конкретная архитектура и ОСь

я сижу на Винде32 и поэтому про другие хоть и знаю, но не пользуюсь
Нужно будет справочник достанем
0
26.06.2014, 22:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2014, 22:36
Привет! Вот еще темы с решениями:

Вызов функций внутри других функций
#include "stdafx.h" #include "stdio.h" #include <iostream> #include...

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

Перегрузка функций. Реализация функций
Разработать функцию f(x) , которая возвращает младшую цифру натурального числа...

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

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