Соглашения о вызове процедуры Sparc - PullRequest
2 голосов
/ 15 июля 2010

Я хотел бы сделать несколько «встроенных» программ на ассемблере в Sparc, и мне интересно, как я могу сделать это с передачей регистров.

Лучше всего объяснить мою проблему на небольшом примере

int main()
{
   int a = 5;
   int b = 6;
   int res;

   asm_addition(a,b);

   printf("Result: %d\n", res);
   return(0);
}
  // My assembler addition

.global asm_addition            

.align  4   

    add rs1, rs2, rd
    restore

Кто-нибудь знает, какие регистры я должен использовать для добавления значений a и b? Наконец, какой регистр мне нужно указать для rd, чтобы результат был напечатан с последним оператором printf, следующим за процедурой сборки.

Большое спасибо за вклад!

Ответы [ 2 ]

0 голосов
/ 04 августа 2010

В Solaris параметр передается через регистр% o0 в% o5, затем через стек. Если вызываемая функция является конечной (то есть не вызывает другую функцию), окно регистров не перемещается вперед, и функция обращается к ним напрямую через% o0 до% o5. Если окно регистров перемещено, то функция может получить доступ к параметрам через регистры от% i0 до% i5. Возвращаемое значение происходит таким же образом через% i0 в вызываемом объекте, который становится% o0 в вызывающем. Для параметра с плавающей точкой они обрабатываются через регистры FP, но там вам придется прочитать документ, на который указывает Dummy00001.

0 голосов
/ 15 июля 2010

Соглашение о вызовах может зависеть от ОС. Я полагаю, Солярис. Google для system v application binary interface sparc, PDF легко найти.

Полная встроенная документация на ассемблере находится где-то в файлах SunStudio PDF, и ее не так просто найти. Официально он также доступен через man -s 1 inline, хотя в моей системе я должен открыть файл вручную. На странице man найдите «Условные обозначения для систем SPARC».

...