SPARC程序集参数中的printf格式说明符?

时间:2011-04-28 05:56:30

标签: c assembly printf sparc

如何使用SPARC程序集获得此C的等效内容:

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

使用函数原型:

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

其中msg是“你好,我的名字是%s。\ n”。

我知道我可以使用.asciz在数据段中定义“Hello,my name is%s。\ n”而没有第一个参数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 个答案:

答案 0 :(得分:2)

我实际上并不确定你做错了什么,但是下面的程序可以正常工作:

        .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

关于参数的传递,像这样的少量参数在寄存器中传递。

答案 1 :(得分:2)

printf,因为它接受变量参数,在堆栈上获取未命名的参数,而不是在寄存器中。也就是说,命名的'format'参数将在第一个参数寄存器中传递,但后续参数将在堆栈中传递。

请参阅the SPARC ABI的“代码示例”部分中的“变量参数列表”部分。

相关问题