Я пытаюсь написать простую функцию, используя встроенную сборку в C для powerpc64, моя функция вызывает другую функцию, и у меня есть пара вопросов, связанных с этим.Подпрограмма PPC64 из встроенной сборки
1) Как сохранить регистр LR до разветвления с помощью 'bl' в подпрограмме?
В частности, для этого кода:
void func(void *arg1, void *arg2)
{
void *result;
__asm__ volatile (
...
...
"bl <address>\n" //Call to subroutine
"nop\n"
...
: [result]"=r"(result)
: [arg1]"r"(arg1),
[arg2]"r"(arg2)
);
return result;
}
компилятор генерирует код пролога для этого без «mflr 0; станд 0, 16 (1)» инструкции для сохранения LR, так как он не знает, что подпрограмма вызывается в моем коде сборки. Включить ли эти инструкции в свой код сборки? Если да, то как узнать размер стека, созданный кодом пролога компилятора, чтобы перейти в область сохранения LR функции, вызывающей функцию «func»? (из учебных пособий по сборке powerpc на developerworks регистры LR должны быть сохранены в фрейме стека функции «вызов»)
2) Я считаю, что мне нужно будет сохранить arg1 и arg2 перед вызовом подпрограммы, которая является правильным местом для temp сохраняет эти параметры перед вызовом подпрограммы - область сохранения параметров или энергонезависимые регистры? Я просто хочу знать, как это делается в качестве продукции. Ppc64 code
Заранее благодарен!
Я хотел бы предложить вам написать эту функцию непосредственно в сборке забывания. Должен сказать, что я никогда не видел вызова подпрограммы из встроенного блока asm (использование которого уже без этого сложно). Я не уверен, что выбранный вами подход совместим с «кодом качества продукции». Я вообще не виню эксперимент (я также потратил время, чтобы понять inline asm), но я думаю, что это сложно: LR и другие регистры должны быть сохранены ... но это означает создание пролога/эпилога функции func внутри встроенного блока asm! Кстати, какова цель этой функции? – amigadev
Спасибо amigadev! Функция, которую я пытаюсь написать, делает некоторые манипуляции с стеком, я хочу вызвать подпрограмму из этой функции, которая сохраняет содержимое стека в куче. Я рассматривал возможность написания кода непосредственно в сборке, но я делаю это как часть проекта, и одна и та же функция для других платформ (x86 и т. Д.) Имеет простую встроенную функцию, и для сборки файла сборки для ppc потребуются некоторые специальные изменения Makefile.Я новичок в написании сборки ppc, поэтому удивительно, что делать такую простую вещь, как вызов подпрограммы, так сложно сделать из встроенной сборки – user2698038
Сложность основана на встроенной сборке, а не на сборке PPC ;-) Ответ mpe дает более точные факты о том, что делать. И он также говорит, что с встроенной сборкой трудно быть уверенным. – amigadev