SPARC汇编参数中的printf格式说明符?

SPARC汇编参数中的printf格式说明符?,c,assembly,printf,sparc,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,我的名字是%s.\n”,而不必使用第一个参数msg,但是有没有办法将字符串传递到包含%s标识符的汇编函数中?char*甚至可以接受格式标识符吗?我尝

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

printf( "Hello, my name is %s.\n", name );
使用功能原型:

void printName( const char* msg, const char* name )
其中msg是“你好,我的名字是%s。\n”

我知道我可以用.asciz在数据段中定义“Hello,我的名字是%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
组装:

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

printName( msg, name );
mov %i0, %o0
mov %i1, %o1
call printf, 2
nop

也许我没有正确地接近函数原型?

我实际上不确定您做错了什么,但以下程序正常工作:

        .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

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

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


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

我不理解这个问题。那个C代码片段有效吗?如果是这样,为什么不看看编译器生成的汇编程序呢?奥利是对的,查看生成的汇编程序将是最简单的方法。我不知道sparc汇编程序,但您可能会发现C函数的参数是在堆栈上传递的,而不是作为寄存器传递的(这看起来就像您正在做的)。如果您还没有,我会先尝试获取“printf”(“hello world\n”);”首先工作,即没有参数说明符,然后从那里开始工作。