如何使用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
也许我没有正确接近功能原型?
答案 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的“代码示例”部分中的“变量参数列表”部分。