Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте нужна ваша помощь в ответе на некоторые вопросы низкоуровневого программирования:
На сколько я понял параметры передаются в функцию в стеке с права на лево, возвращаемый параметр выводиться в EAX а стек обслуживает вызывающая программа, то есть правильно ли я понял что если вызывается функция "void test(int a,int b, int c)" то изменения для вызывающей программы в регистрах, флагах и стеках после возвращения из функции не произойдут? если так то вопрос снят, если, что то меняется, то как в функции реализовать асемблировские аля "pushad pushfd" средствами c++?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2014, 12:44
Ответы с готовыми решениями:

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

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

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

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

16
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.06.2014, 14:08 2
Цитата Сообщение от ZwHook Посмотреть сообщение
то как в функции реализовать асемблировские аля "pushad pushfd" средствами c++?
а зачем если компилятор переведет ващу ф-цию на ассемблер таким образом что после выхода из ф-ции значения регистров не поменяются?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
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
18898 / 9856 / 2410
Регистрация: 30.01.2014
Сообщений: 17,299
25.06.2014, 14:26 4
Цитата Сообщение от ZwHook Посмотреть сообщение
На сколько я понял параметры передаются в функцию в стеке с права на лево, возвращаемый параметр выводиться в EAX
Строго говоря это не так. Во-первых есть разные конвенции вызова. Во-вторых, компилятор может вообще не делать вызов, а разместить вместо этого тело функции (встроить функцию). В третьих, результат совершенно не обязан быть в EAX.

Добавлено через 3 минуты
Вот еще по теме.
0
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
25.06.2014, 19:43  [ТС] 5
Нет тут вопрос немного в другом наверно я не правильно выразился, я буду из АСЕМБЛЕРА(точней из сторонней программы), вызывать мою функцию(которая в dll) и передавать ей некоторые параметры программы обрабатывать их, задача в том, что бы после моей функции все регистры, флаги и стек были в первозданном виде как до вызова функции, причем это надо сделать средствами самой функции c++, как это проще реализовать? мне от незнания c++ приходит в голову только asm вставка вначале функции pushad pushfd а в конце popfd popad, но я сомневаюсь что это правильно
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
26.06.2014, 09:24 6
Цитата Сообщение от ZwHook Посмотреть сообщение
флаги и стек были в первозданном виде как до вызова функции,
они будут расслабтесь, это называется инжект в память)
0
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
26.06.2014, 17:10  [ТС] 7
Вообщем нет, хренит к чертям регистры которые указал товарищ выше, самая главная проблема при вызове из длл функции, весь стек забивает "cccccccc", есть какая нибудь возможность избежать этого?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
26.06.2014, 17:33 8
Зачем тебе стек в первозданном виде, если он по сути тебе не доступен нормальными методами ниже указателя стека? Твоих данных там быть не должно. Подпрограмма не должна восстанавливать стек. Указатель на него - да (в случае cdecl).
0
-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
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
26.06.2014, 18:49 10
Ну тогда ручками после вызова свой стек на место возвращай.
1
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
26.06.2014, 19:03  [ТС] 11
да я так и сделал, но в асемблере, в c++ я так понял тоже ручками(асм вставки)?
и еще нельзя экспортировать stdcall функцию из длл, а программа внешняя программа подрузамевает что я сам слежу за стеком, тоже ручками(вставкой asm) к esp добавлять ?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
26.06.2014, 19:07 12
Цитата Сообщение от ZwHook Посмотреть сообщение
в c++ я так понял тоже ручками(асм вставки)
Зачем? Любая переменная на стеке - считай, указатель на область стека. Дальше работаешь со стеком через указатели на свой страх и риск.
Цитата Сообщение от ZwHook Посмотреть сообщение
и еще нельзя экспортировать stdcall функцию из длл, а программа внешняя программа подрузамевает что я сам слежу за стеком, тоже ручками(вставкой asm) к esp добавлять ?
Не понял ничего
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
26.06.2014, 19:15 13
Цитата Сообщение от ZwHook Посмотреть сообщение
а она может вызвать к примеру call esp +40 и тп
покаж
не разу такого не встречал
Цитата Сообщение от ZwHook Посмотреть сообщение
хренит к чертям регистры которые указал товарищ выше, самая главная проблема при вызове из длл функции, весь стек забивает "cccccccc",
соглашения о вызовах соблюдаешь?
Паскалевская функция сама очищает стек от аргументов
Сишная не чистит чистит вызывающая сторона


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

рекомендую книгу К. Касперский "Техника отладки программ без исходных кодов"
там целая глава посвящена функциям и какие соглашения о вызовах у разных компиляторов
0
-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
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
26.06.2014, 20:35 15
Цитата Сообщение от ZwHook Посмотреть сообщение
03B6183C C2 0C00 RETN 0xC
вместо
03B6183C C2 RETN
о чем я и говорил
сишное и паскалевское соглашение

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

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

я сижу на Винде32 и поэтому про другие хоть и знаю, но не пользуюсь
Нужно будет справочник достанем
0
26.06.2014, 22:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.06.2014, 22:36
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru