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的“代码示例”部分中的 “变量参数列表”部分。