Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ассемблерные вставки

74K
28 февраля 2012 года
efviop
13 / / 24.11.2011
Добрый день Уважаемые. Может кто подскажет как реализовать в ассемблерных вставках добавление элемента в вектор?
252
02 февраля 2015 года
koderAlex
1.4K / / 07.09.2005
как обычно пихаешь в стек аргументы push-ем , вызываешь метод call-ом .
326
02 февраля 2015 года
sadovoya
757 / / 19.11.2005
Т.е. выполнить vec.push_back(value) ? Тогда надо еще не забыть передать и неявный параметр для нестатических ф-ций-членов, о котором надеюсь слышали. Иначе читайте о this и указателях на функции-члены. Речь полагаю о С++.
326
06 февраля 2015 года
sadovoya
757 / / 19.11.2005
У меня в Windows для компилятора TDM-GCC 4.8.1 получилось так:

Код:
#include <iostream>
#include <vector>

int main() {
    {
        std::vector<double> vd;
        double dig = 0.255;
        asm volatile(
            "movl %2,%%ecx\n" //адрес объекта vd
            "pushl %1\n"      //параметр для push_back
            "calll *%0\n"     //push_back
            :
            :"r"(&std::vector<double>::push_back),"r"(&dig),"r"(&vd)
            :"%ecx","memory"
        );
        std::cout << vd[0] << std::endl;
    }

    {
        //подобно такому:
        std::vector<double> vd;
        //vd.push_back(0.255); можно переписать так:
        void(std::vector<double>:: *p)(const double&) =
            &std::vector<double>::push_back;
        (vd.*p)(0.255);//здесь неявно передается this
        std::cout << vd[0] << std::endl;
    }

    return 0;
}
Т.е. тут соглашение thiscall реализуется так: параметр метода передается через стек, адрес объекта - через регистр ecx. За очистку стека отвечает вызываемая сторона (метод).
А вот в Linux для gcc 4.7 по-другому:
 
Код:
asm volatile(
            "pushl %1\n"      //параметр для push_back
            "pushl %2\n"      //адрес объекта vd
            "calll *%0\n"     //push_back
            "addl $8,%%esp"
            :
            :"r"(&std::vector<double>::push_back),"r"(&dig),"r"(&vd)
            :"memory"
        );
Т.е. в стеке передается и параметр метода и адрес объекта. Адрес объекта в стек впихивается последним. За очистку стека отвечает вызывающая сторона (т.е. мы сами).
326
06 февраля 2015 года
sadovoya
757 / / 19.11.2005
Да, платформы 32-битные разумеется.
P.S. Работает для невертуальных методов и других классов. А вот с виртуальными ф-циями подобное не работает. И вообще, у разных компиляторов и даже, насколько понимаю, их версий, а также платформы, вызов нестатических ф-ций членов по-разному реализуется. Для случая методов с переменным числом параметров вызов может тоже отличаться.
327
07 февраля 2015 года
UserNet2008
748 / / 03.04.2010
Вы ЧЁ .Тема 28 февраля 2012 года умерла 3 лет назад.
252
09 февраля 2015 года
koderAlex
1.4K / / 07.09.2005
вылезла в неотвеченных . на дату не посмотрел (
пусть будет - может кому пригодится . )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог