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

如何使用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,但有没有办法将字符串传递给一个具有%的汇编函数它的标识符? 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 

也许我没有正确接近function原型?

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

  .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’参数将在第一个参数寄存器中传递,但后续参数将在堆栈上传递。

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