-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
|
|
1 | |
Механика функций C++25.06.2014, 12:44. Показов 1037. Ответов 16
Метки нет (Все метки)
Здравствуйте нужна ваша помощь в ответе на некоторые вопросы низкоуровневого программирования:
На сколько я понял параметры передаются в функцию в стеке с права на лево, возвращаемый параметр выводиться в EAX а стек обслуживает вызывающая программа, то есть правильно ли я понял что если вызывается функция "void test(int a,int b, int c)" то изменения для вызывающей программы в регистрах, флагах и стеках после возвращения из функции не произойдут? если так то вопрос снят, если, что то меняется, то как в функции реализовать асемблировские аля "pushad pushfd" средствами c++?
0
|
25.06.2014, 12:44 | |
Ответы с готовыми решениями:
16
Механика обобщённых функций Механика оптимизации Механика работы условия if Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h |
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
25.06.2014, 14:08 | 2 |
а зачем если компилятор переведет ващу ф-цию на ассемблер таким образом что после выхода из ф-ции значения регистров не поменяются?
0
|
18898 / 9856 / 2410
Регистрация: 30.01.2014
Сообщений: 17,299
|
|
25.06.2014, 14:26 | 4 |
Строго говоря это не так. Во-первых есть разные конвенции вызова. Во-вторых, компилятор может вообще не делать вызов, а разместить вместо этого тело функции (встроить функцию). В третьих, результат совершенно не обязан быть в 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 |
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 и тп
пример вызова
0
|
-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 |
Зачем? Любая переменная на стеке - считай, указатель на область стека. Дальше работаешь со стеком через указатели на свой страх и риск.
Не понял ничего
0
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
|
26.06.2014, 19:15 | 13 |
покаж
не разу такого не встречал соглашения о вызовах соблюдаешь? Паскалевская функция сама очищает стек от аргументов Сишная не чистит чистит вызывающая сторона да он может быть в 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 |
о чем я и говорил
сишное и паскалевское соглашение вот на будущее http://ru.wikipedia.org/wiki/Соглашение_о_вызове
0
|
18898 / 9856 / 2410
Регистрация: 30.01.2014
Сообщений: 17,299
|
|
26.06.2014, 22:29 | 16 |
Я ссылочку дал на документ, где все подробно расписано что где может быть
И ссылку эту (про соглашение) на википедию, я тоже уже давал На самом деле ответ на вопрос ТС был в том документе, в разделе 7, Function calling conventions. Нужно было просто внимательно прочитать
1
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
|
26.06.2014, 22:36 | 17 |
ну не заметил
с кем не бывает? но даже по этой ссылочке выходит что для целочисленых AX(EAX RAX) главное для плавающих вершина стека сопра но я про них как то подзабыл а вообще такие вопросы абстрактно не решаются , конкретная архитектура и ОСь я сижу на Винде32 и поэтому про другие хоть и знаю, но не пользуюсь Нужно будет справочник достанем
0
|
26.06.2014, 22:36 | |
26.06.2014, 22:36 | |
Помогаю со студенческими работами здесь
17
Передача значений функций в главную программу, вызов функций Вызов функций внутри других функций Объявление функций внутри других функций Объекты класса (математика, физика, программирование, линейная алгебра, математический анализ, теоретическая механика)) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |