2010-07-15 3 views
2

Я хотел бы сделать некоторое «встроенное» программирование в Sparc, и мне интересно, как я могу это сделать с прохождением регистра.Процедуры вызова процедур 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 

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

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

ответ

0

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

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

0

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

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