Ассемблерные вставки
Добрый день Уважаемые. Может кто подскажет как реализовать в ассемблерных вставках добавление элемента в вектор?
как обычно пихаешь в стек аргументы push-ем , вызываешь метод call-ом .
Т.е. выполнить vec.push_back(value) ? Тогда надо еще не забыть передать и неявный параметр для нестатических ф-ций-членов, о котором надеюсь слышали. Иначе читайте о this и указателях на функции-члены. Речь полагаю о С++.
Код:
#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;
}
#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;
}
А вот в 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"
);
"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"
);
P.S. Работает для невертуальных методов и других классов. А вот с виртуальными ф-циями подобное не работает. И вообще, у разных компиляторов и даже, насколько понимаю, их версий, а также платформы, вызов нестатических ф-ций членов по-разному реализуется. Для случая методов с переменным числом параметров вызов может тоже отличаться.
Вы ЧЁ .Тема 28 февраля 2012 года умерла 3 лет назад.
пусть будет - может кому пригодится . )