2

你如何用 SPARC 程序集得到这个 C 的等价物:

printf( "Hello, my name is %s.\n", name );

使用函数原型:

void printName( const char* msg, const char* name )

其中 msg 是“你好,我的名字是 %s。\n”。

我知道我可以在没有第一个参数 msg 的情况下使用 .asciz 在数据段中定义“你好,我的名字是 %s。\n”,但是有没有办法将字符串传递给具有 % 的汇编函数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

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

4

2 回答 2

2

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

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

于 2011-05-23T05:56:27.333 回答
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

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

于 2011-05-14T16:13:02.413 回答