2015-10-13 2 views
0

Я пытаюсь написать простую функцию, используя встроенную сборку в 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

Заранее благодарен!

+0

Я хотел бы предложить вам написать эту функцию непосредственно в сборке забывания. Должен сказать, что я никогда не видел вызова подпрограммы из встроенного блока asm (использование которого уже без этого сложно). Я не уверен, что выбранный вами подход совместим с «кодом качества продукции». Я вообще не виню эксперимент (я также потратил время, чтобы понять inline asm), но я думаю, что это сложно: LR и другие регистры должны быть сохранены ... но это означает создание пролога/эпилога функции func внутри встроенного блока asm! Кстати, какова цель этой функции? – amigadev

+0

Спасибо amigadev! Функция, которую я пытаюсь написать, делает некоторые манипуляции с стеком, я хочу вызвать подпрограмму из этой функции, которая сохраняет содержимое стека в куче. Я рассматривал возможность написания кода непосредственно в сборке, но я делаю это как часть проекта, и одна и та же функция для других платформ (x86 и т. Д.) Имеет простую встроенную функцию, и для сборки файла сборки для ppc потребуются некоторые специальные изменения Makefile.Я новичок в написании сборки ppc, поэтому удивительно, что делать такую ​​простую вещь, как вызов подпрограммы, так сложно сделать из встроенной сборки – user2698038

+0

Сложность основана на встроенной сборке, а не на сборке PPC ;-) Ответ mpe дает более точные факты о том, что делать. И он также говорит, что с встроенной сборкой трудно быть уверенным. – amigadev

ответ

1

AFAIK нет способа сделать это должным образом. Inline asm не предназначен для вызова функций.

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

Но у вас нет есть для хранения LR в кадре стека вызывающего абонента, лучше, если вы это сделаете, но это не требуется на 100%. Так что просто поставьте его в энергонезависимый, отметьте, что регистр как сбитый, и восстановите его на обратном пути.

Вам не нужно сохранять arg1 и arg2, но то, что вы должны сделать, это пометить все изменчивые регистры как clobbered. Затем компилятор сохранит все, что находится в летучих регистрах (например, arg1 и arg2), прежде чем он называет ваш asm. Также помните, что некоторые поля CR могут быть сбиты. Я также добавлю «память» к clobbers, чтобы GCC пессимистично оценивал оптимизацию через asm.

Если вы сделаете все, что может работать, если я что-то :)

 Смежные вопросы

  • Нет связанных вопросов^_^