Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/20: Рейтинг темы: голосов - 20, средняя оценка - 4.55
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
1

Передача параметров в функцию asm вставкой в C++ Builder 2010

09.08.2010, 16:08. Просмотров 3844. Ответов 3
Метки нет (Все метки)

Всем привет!

Есть функция static void _stdcall. Вызов её происходит неявно, поскольку указатель на эту функцию передается в качестве параметра в другую функцию. Не буду вдаваться в подробности как и зачем это делается... Т.к. функция явно не вызывается, соответственно я не могу явно передать в неё параметры...

Однако,... насколько мне подсказывает мой ничтожный опыт и интуиция, это можно сделать с помощью asm вставки....

Итак вопрос как передать в функцию параметры с помощью ассемблера?..
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2010, 16:08
Ответы с готовыми решениями:

Помогите с Asm-вставкой для Delphi
есть некий алгоритм, хочу реализовать его в делфе с помощью асм вставок, но ничего не получается,...

Установить BX числу равному полю регистра AX с 0 по 3 биты (С++ с asm-вставкой)
Установить BX числу равному полю регистра AX с 0 по 3 биты. Считать, что число положительное ...

Передача параметров из asm в VBA и обратно
Sorry коллеги, может пустяковая тема, но на форуме почему то не нашел (может плохо искал). очень...

Решение уравнения на С++ со вставкой asm
Здравствуйте, прошу помощи в решении уравнения на asm.Есть наработки но появляются непонятные...

Передача параметров в функцию
Добрый вечер Не получается передать в функцию массив выдает ошибку #include <cstdio> struct...

3
Orwomoi
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
09.08.2010, 16:28 2
stdcall функции получают параметры из стека, которые лежат перед адресом возвращения. А стэк каждая функция использует как ей вздумается. То-есть промежуточная функция (которая получает указатель) изменит стэк. Значит пердать параметры через него не получится. Можно попробовать положить параметры в стэк до вызова промежуточной функции. Но тогда надо высчитывать как далеко ушел ESP при вызове нужной функции, а из нее обращаться в параметрам (ESP-<сколько байтов заняла промежуточная функция>).

Самый простой вариант - глобальные переменные!
0
davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
09.08.2010, 16:39  [ТС] 3
Цитата Сообщение от Orwomoi Посмотреть сообщение
stdcall функции получают параметры из стека, которые лежат перед адресом возвращения. А стэк каждая функция использует как ей вздумается. То-есть промежуточная функция (которая получает указатель) изменит стэк. Значит пердать параметры через него не получится. Можно попробовать положить параметры в стэк до вызова промежуточной функции. Но тогда надо высчитывать как далеко ушел ESP при вызове нужной функции, а из нее обращаться в параметрам (ESP-<сколько байтов заняла промежуточная функция>).

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

В конце концов можно изменить тип вызова функции, если не подходит stdcall, можно подставить подходящий... Ведь, насколько я понимаю, на результат это особо не повлияет. Повлияет только на способ размещения параметров в памяти...
0
Orwomoi
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
09.08.2010, 17:26 4
Помоему, для нормального решения нужен доступ к промежуточной функции. А если есть доступ, можно передать ей параметр, а она передаст главной.

Но если изменить промежуточную функцию невозможно. Можно просмотреть ее работу в дизассемблере, если есть неиспользуемые регистры, попробовать передать параметр через этот регистр. Если нужно передать несколько параметров, можно передать один указатель на массив параметров. Или передать параметры через FPU, XMM регистры. О_о

А если даже регистров нет, можно попробовать совсем плохой вариант. В главной функции, перед вызовом промежуточной, затолкать в стэк параметры. Скомпилированный вариант промежуточной функции открыть в дизассемблере. Посмотреть адрес ESP (1), прогнать до вызова главной функции, посмотреть новый адрес ESP (2). ESP1 минус ESP2 = колическтво байт, которые использует промежуточная функция (Result). Потом в главной функции можно обращаться к параметрам через

Assembler
1
2
3
4
5
6
push ebp
mov ebp,esp
param 1 = (ebp+4) + result
param 2 = (ebp+4) + (result+4)
param 3 = (ebp+4) + (result+8)
и тд...
P.S. Примеров нет, потому что я не знаю С++. И подводные камни связаные с ООП не учитываю.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2010, 17:26

Передача параметров в функцию
Пишу на VS C++ 2011 Windows form application не получается передать перменную класса в функцию тип...

Передача параметров в функцию
void f(int a) ; // передача по значению void f(int *a);//передача по ссылке void f(int &amp;a) ;...

Передача параметров в функцию
Как понять , что передаётся в функцию при такой записи : void Fun(str* &amp;r) при этом есть такие...


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

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

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