LINUX.ORG.RU

Ответ на: комментарий от anonymous

А в чем проблема то?

почему обязательно проблема, может человек просто записал, что нужно сделать, чтоб не забыть.

Novel ★★★★
()

Какие проблемы? Воспользуйся гуглом или Яндексом. C умеет в функции с неопределенным числом аргументов.

peregrine ★★★★★
()
Ответ на: комментарий от mittorn

понимание правильное, решения нет, я так понимаю нужно просто запустить функцию с помощью ассемблерных вставок, n раз спушить аргументы

Alexey1994
() автор топика
Ответ на: комментарий от Alexey1994

хотя, 4096, думаю больше никто не напишет, но в идеале весь стек

Alexey1994
() автор топика
Ответ на: комментарий от Alexey1994

Вот, например обсуждение в контексте враппера swig. http://www.swig.org/Doc1.3/Varargs.html#Varargs_nn7

Также http://www.chiark.greenend.org.uk/doc/libffi-dev/html/The-Basics.html

Гугли сам уж. libffi example, libffi varargs example.

Если лень парсить доку, можешь взять luajit'овский ffi, там все проще, но нужен базис в виде луа-апи для вызовов (и это дороже, хотя сам факт юзания любого ffi — это уже конкретный оверхед).

arturpub ★★
()
Ответ на: комментарий от Alexey1994

Скорее всего да. Либо какой-то либой для этого, она обеспечит портируемость, предоставив везде имплементации.

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

пока сделал так:

void(*f)()=a;

__asm__( «movl $4, 12(%esp)\n» «movl $3, 8(%esp)\n» «movl $2, 4(%esp)\n» «movl $1, (%esp)» );

__asm__( «call %0» : :«r»(f) );

на динамику нет намёка, ещё 3-й аргумент занят под вызов функции

Alexey1994
() автор топика

Ты уверен, что нельзя просто скастовать в определённый тип? Покажи код.

Deleted
()
Ответ на: комментарий от Alexey1994

Я не о том. Я о том что зачем тебе впринципе такую функцию писать.

matrixd
()
Ответ на: комментарий от Alexey1994

Слишком много поводов для слома, к тому же не факт что аргументы будут не в регистрах. Я бы хотя бы функцию-вызыватель делал через varargs.

slapin ★★★★★
()
Ответ на: комментарий от slapin

Да и вообще постановка задачи говно, особенно в случае произвольных функций - что делать с аргументами по ссылке? Или заранее всё известно про вызываемую функцию, просто надо трамплин написать? А какая тогда связь с динамическими библиотеками?

slapin ★★★★★
()
Ответ на: комментарий от Alexey1994

да, только архитектур разных - просто умотаться.
есть ощущение, что ты городишь какой-то самодельный велосипед для стандартной задачи. поясни, чего ты хочешь получить в итоге, и тогда тебе конкретно ответят.

Iron_Bug ★★★★★
()
Ответ на: комментарий от slapin

нужно вызывать функции из библиотек в интерпретаторе

Alexey1994
() автор топика
Ответ на: комментарий от Alexey1994

так возьми код любого компилятора тогда, для твоей архитектуры. тебе надо будет заполнять стек, в зависимости от используемой конвенции. а сигнатуру функции будешь из своего парсера выколупывать.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

в принципе я так и сделал-посмотрел на вызов функции в дизассемблере, просто на ассемблере это решение очевидно, думал что и на си может быть подобное решение

Alexey1994
() автор топика
Ответ на: комментарий от Alexey1994

ты отличаешь компиляцию от вызова в рантайме? сначала ты заявляешь, что пишешь компилятор. то есть, трансяцию некоего кода в бинарь для конкретной архитектуры. потом ты пишешь, что у тебя, оказывается, интерпретатор и если он не jit, то ты просто дёргаешь функцию из библиотеки. но в этом случае всё, предложенное выше, подойдёт. тот же libffi, dyncall. это всяко лучше, чем ассемблерный велосипед. и там поддержка разных архитектур искаропки.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

отличаю, компилятор конечный продукт, сейчас я пишу для него отладчик, в нём и нужна подобная хрень для моего компа получилось не сложно:

for(i=0; i<4; i++)

{

__asm__(

«sub $4, %esp\n»

«movl $1, (%esp)»

);

}

__asm__(

«call %0»

:

:«r»(f)

);

Alexey1994
() автор топика
Ответ на: комментарий от Alexey1994

Плохой код:

У компилятора могут быть собственные представления о esp (особенно, если кто-то сделал omit-frame-pointer), которые нарушаются;

Asm-вставка меняет память, но не указывает это;

После вызова нет освобождения памяти под них;

Если уж так делать, то я бы выделил места под аргументы через alloca(), понадеявшись, что вернётся память на вершине стека. Это хотя бы запретит компилятору надеяться на esp и позволит записывать аргументы из си.

vzzo ★★★
()
Ответ на: комментарий от vzzo

ещё вопрос: как проталкивать вещественные аргументы?

Alexey1994
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.