спецификатор формата printf в аргументе сборки SPARC? - PullRequest
2 голосов
/ 28 апреля 2011

Как получить эквивалент этого C со сборкой SPARC:

printf( "Hello, my name is %s.\n", name );

с использованием прототипа функции:

void printName( const char* msg, const char* name )

где msg - "Здравствуйте, меня зовут% s. \ N".

Я знаю, что могу определить «Здравствуйте, меня зовут% s. \ N» в сегменте данных с .asciz без первого аргумента msg, но есть ли способ передать строку в функцию сборки, которая бы есть идентификатор% s в нем? Может ли char * даже брать идентификатор формата? Я пробовал следующее, но я получаю дамп ядра.

Вызов функции в C:

char * msg = "Hello, my name is %s.\n";
char * name = "Foo";

printName( msg, name );

Монтаж:

mov %i0, %o0
mov %i1, %o1
call printf, 2
nop

Может быть, я не правильно подхожу к прототипу функции?

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

printf, поскольку он принимает переменные аргументы, принимает безымянные аргументы в стеке, а не в регистрах.Таким образом, именованный аргумент 'format' будет передан в регистр первого аргумента, но последующие аргументы будут переданы в стеке.

См. Раздел "Список аргументов переменной" в разделе "Примеры кода" раздела СПАРК АБИ .

2 голосов
/ 14 мая 2011

Я на самом деле не совсем уверен, что вы делаете неправильно, но следующая программа работает как надо:

        .data
s0:     .asciz  "foo %s\n"
s1:     .asciz  "bar"
        .text
        .global main
main:
        save    %sp, -96, %sp
        set     s0, %o0
        set     s1, %o1
        call    prtnam
        nop
        ret
        restore
prtnam:
        save    %sp, -96, %sp
        mov     %i0, %o0
        call    printf
        mov     %i1, %o1
        ret
        restore

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

...