Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

25.06.2014, 12:44. Просмотров 439. Ответов 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++):

Механика оптимизации - C++
Вопрос по работе компилятора. При определенных условиях он вырезает из обработчика прерываний куски кода. Хотелось бы понять, исходя из...

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

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

Вызов функций внутри других функций - C++
#include "stdafx.h" #include "stdio.h" #include <iostream> #include <fstream> #include <iomanip> using namespace std; ...

Объявление функций внутри других функций - C++
Иногда вижу в некоторых исходниках на c объявление функций, внутри main. Например: main(){ double sum(int max_num); } ...

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

16
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.06.2014, 14:08 #2
Цитата Сообщение от ZwHook Посмотреть сообщение
то как в функции реализовать асемблировские аля "pushad pushfd" средствами c++?
а зачем если компилятор переведет ващу ф-цию на ассемблер таким образом что после выхода из ф-ции значения регистров не поменяются?
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
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
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
26.06.2014, 19:07 #12
Цитата Сообщение от ZwHook Посмотреть сообщение
в c++ я так понял тоже ручками(асм вставки)
Зачем? Любая переменная на стеке - считай, указатель на область стека. Дальше работаешь со стеком через указатели на свой страх и риск.
Цитата Сообщение от ZwHook Посмотреть сообщение
и еще нельзя экспортировать stdcall функцию из длл, а программа внешняя программа подрузамевает что я сам слежу за стеком, тоже ручками(вставкой asm) к esp добавлять ?
Не понял ничего
0
ValeryS
Модератор
6705 / 5114 / 482
Регистрация: 14.02.2011
Сообщений: 17,183
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
Модератор
6705 / 5114 / 482
Регистрация: 14.02.2011
Сообщений: 17,183
26.06.2014, 20:35 #15
Цитата Сообщение от ZwHook Посмотреть сообщение
03B6183C C2 0C00 RETN 0xC
вместо
03B6183C C2 RETN
о чем я и говорил
сишное и паскалевское соглашение

вот на будущее
http://ru.wikipedia.org/wiki/Соглашение_о_вызове
0
26.06.2014, 20:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2014, 20:35
Привет! Вот еще темы с ответами:

функции класса раздела private реализуються так же как и раздела public? в смысле виртуальных функций, дружественных функций, и т.д. - C++
функции класса раздела private реализуються так же как и раздела public? в смысле виртуальных функций, дружественных функций, и т.д.

Использование функций и шаблонов функций - C++
Составьте программу – формирование цены на молоко. Животновод в начале каждой зимы цену на молоко на р%, а каждым летом снижает на столько...

Перегрузка функций. Реализация функций - C++
Разработать функцию f(x) , которая возвращает младшую цифру натурального числа x . Вычислить с ее помощью значение выражения z= f(a) +...

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


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

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

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