С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202

Вернуть адрес виртуальной функции с помощью __asm вставки

22.09.2015, 18:54. Показов 1496. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class two{
 
public:
 
};
 
class one{
 
public:
virtual ~one();
virtual void function0() = 0;
virtual void function1() = 0;
virtual two getTwo() = 0;
};
Хочу написать функцию, которая возвращала бы мне адрес экземпляра моего класса, например, адрес экземпляра класса two будет:

C++
1
2
3
4
5
6
7
8
int main(){
 
one* oneClass = new one();
 
printf("0x%x", oneClass ->getTwo());
 
return 0;
}
Пытаюсь вернуть адрес такой функцией:

C++
1
2
3
4
5
6
7
8
9
two getTwoAdr(){
 
 __asm{
 
    mov eax, базовый_адрес;
    call eax
    retn
 }
}
"базовый_адрес" - это базовый адреc виртуальной_функции "virtual two getTwo() = 0;" я могу отыскать его при помощи дебага.
В общем за ассемблер взялся только сегодня, с регистрами не разобрался еще, а функцию нужно прямо сейчас, пожалуйста помогите.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2015, 18:54
Ответы с готовыми решениями:

Как вернуть свой ip адрес после замены с помощью программы Proxy switcher ?
Час добрый!Проблема-поменял IP адрес с помощью программы Proxy switcher.Испужался чёт последствий.Решил вернуть всё наместо.Но как?Вот...

Вычисление кусочной функции с помощью ассемблерной вставки в код на Pascal
Итак суть задания. В соответствии с заданием, вычисления у1 и у2 запрограммируйте на языке Ассемблера, вычисление у - на языке Паскаль....

Как получить в программе адрес файла, при попытке открыть его с помощью функции "открыть с помощью"
Доброго времени суток. Второй день ищу ответ на вопрос: как получить в программе адрес файла, при попытке открыть его с помощью...

18
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
22.09.2015, 19:50
Почему бы просто не вернуть this ?
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
22.09.2015, 20:10  [ТС]
Цитата Сообщение от smartpointer Посмотреть сообщение
Почему бы просто не вернуть this ?
нужно как бы написать функцию эквивалентной
C++
1
one* oneClass = new one(); oneClass ->getTwo();
Что касается 'this", я так понял у меня с этим и ошибка, ассемблерная инструкция берет при вызове "this" и из того места от куда вызывается и мне как -то нужно это исправить и передать в регистр указатель на экземпляр класса "one"
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
22.09.2015, 20:40
В общем для методов класса неявно передается +1 аргумент,первым из которых и является this - примерный аналог Сишечным инициализациям структур с помощью функции. Вот примерный код на 64 битной машине с gcc.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
 
class A
{
public:
    A* GetClass()
    {
        asm("mov 0x10(%rbp),%rax");
    }
    virtual void Test()
    {
        std::cout<<"This is A\n\n";
    }
};
class B : public A
{
public:
    void Test()
    {
        std::cout<<"This is B\n\n";
    }
};
 
class C : public A
{
    void Test()
    {
        std::cout<<"This is C\n\n";
    }
};
 
int main()
{
    A* a[3] = {new A,new B,new C};
    for(unsigned i = 0; i < 3; ++i)
    {
        std::cout<<"&a["<<i<<"]: "<<a[i]<<std::endl;
        std::cout<<"Adress of a["<<i<<"]: "<<a[i]->GetClass() <<std::endl;
        a[i]->GetClass()->Test();
        delete a[i];
    }
    return 0;
}
1
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
22.09.2015, 21:00  [ТС]
Цитата Сообщение от smartpointer Посмотреть сообщение
для методов класса неявно передается +1 аргумент,первым из которых и является this
Вот, вот ты меня правильно понял, так а что делать с функцией тогда? Когда я начинаю вызов ассемблерной вставки в функции, this то там передается как адрес функции, а не того класса, который мне нужен, вот как мне передать в ассемблерный код этот "this"(адрес класса из которого идет вызов функции), я то в принципе могу заранее знать адрес экземпляра виртуального класса, которого мне нужно вызвать, как передать в асм-вставку этот адрес?
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
22.09.2015, 21:40
ДЕСАНТУРА, В вашем примере класс объявлен абстрактным, следовательно this-а там не может быть и
C++
1
one* oneClass = new one();
не должно компилироваться. В моем примере возврат адреса работает согласно тому, какой класс его вызывал, даже в случае, если оба класса наследуются от абстрактного.В общем случае достаточно возратить this - эффект будет тот же.
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
23.09.2015, 09:00  [ТС]
Цитата Сообщение от smartpointer Посмотреть сообщение
В моем примере возврат адреса работает согласно тому, какой класс его вызывал
Как подсунуть вызов - как буд-то я из этого класса вызывал бы? Вот что мне нужно.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
23.09.2015, 09:13
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
Как подсунуть вызов - как буд-то я из этого класса вызывал бы? Вот что мне нужно.
А это вообще разве не от реализации зависит? Ну, организация таблицы виртуальных функций и способы разрешения виртуальных функций?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
23.09.2015, 09:22
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
ассемблерная инструкция берет при вызове "this" и из того места от куда вызывается и мне как -то нужно это исправить и передать в регистр указатель на экземпляр класса "one"
на уровне ассемблера х86 this обычно передается в регистре ecx, но я бы не стал на это закладыватся, любая оптимизация и правила могут изменится
каков сакральный смысл использовать ассемблерную вставку? убить оптимизацию?
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
23.09.2015, 09:42  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
убить оптимизацию?
как не странно это ускоряет выполнение кода
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
23.09.2015, 09:49
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
как не странно это ускоряет выполнение кода
У тебя уже есть готовый вариант для сравнения?
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
23.09.2015, 09:59  [ТС]
Цитата Сообщение от Enno Посмотреть сообщение
У тебя уже есть готовый вариант для сравнения?
вызвал вставку через класс, как посоветовал "smartpointer" и сравнил с обычным вызовом.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
23.09.2015, 10:03
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
вызвал вставку через класс, как посоветовал "smartpointer" и сравнил с обычным вызовом.
Значит проблема разрешена и тему можно закрывать?
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
23.09.2015, 10:16  [ТС]
Цитата Сообщение от Enno Посмотреть сообщение
Значит проблема разрешена и тему можно закрывать?
Нет, я просто ответил на твой вопрос.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
23.09.2015, 10:26
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
как не странно это ускоряет выполнение кода
ты возьми сишный код, включи оптимизацию по скорости, и тогда сравнивай
и посмотри что сгенерит компилятор
там будет что то типа
C++
1
2
mov     eax, [ecx]
call    dword ptr [eax+0x04]
что тут убыстрять?
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
23.09.2015, 10:39  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
что тут убыстрять?
Да мне не нужно нечего убыстрять, мне нужно в функции вызвать виртуальный класс и вернуть его адрес, при помощи ассемблерной вставки, а пока что не дружу с "__asm".
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
23.09.2015, 11:10
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
мне нужно в функции вызвать виртуальный класс
виртуальный класс, это какой?

Добавлено через 4 минуты
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
call eax
ты уверен что возвращаешь адрес?
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
это базовый адреc виртуальной_функции "virtual two getTwo() = 0;"
вызывать чистую виртуальную функцию мосье знает толк в извращениях
и что даст вызов _purecall? аварийный выход?
0
 Аватар для levgen
3 / 3 / 2
Регистрация: 07.02.2013
Сообщений: 185
23.09.2015, 11:16
Десантура, smartpointer правильно указал
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
23.09.2015, 12:42  [ТС]
Цитата Сообщение от levgen Посмотреть сообщение
Десантура, smartpointer правильно указал
Он указал правильно, но это вызов внутри класса, а мне нужно с функции, зная базовый адрес виртуального класса и зная заранее экземпляр инициализированного класса(его адреса) из которого будет вызвана функция
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.09.2015, 12:42
Помогаю со студенческими работами здесь

Вставки на asm
Можно-ли использовать subj при программировании на directx? Меня обругивает...

Builder C++ и asm вставки
У меня есть задание: даны 2 массива (двумерный и одномерный), нужно умножить из на разные множители (ввод с клавиатуры) и сложить... По...

ASM Вставки iDIV
Пишу NumX:=-40; MOV EAX,NumX MOV ECX,4 IDIV ECX MOV IntPart, EAX

Asm-вставки не работают
Собственно в этом и проблема. Компилятор матерится на ассемблерный код. И не важно где я пытаюсь это компилировать - в Виндовс или...

Asm вставки в AVR GCC
Есть у кого-то описание как писать эти _страшные_ вещи? Конструкция подразумевающая всего лишь swap регистра, превращается в: #define ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru