SPARC汇编参数中的printf格式说明符?
如何使用SPARC程序集获得此C的等效项: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*甚至可以接受格式标识符吗?我尝
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”);”首先工作,即没有参数说明符,然后从那里开始工作。