2

この C に相当するものを SPARC アセンブリで取得するにはどうすればよいですか。

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

関数プロトタイプの使用:

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

ここで、msg は「こんにちは、私の名前は %s です。\n」です。

最初の引数 msg を使用せずに .asciz を使用してデータ セグメントで "Hello, my name is %s.\n" を定義できることはわかっていますが、% を持つアセンブリ関数に文字列を渡す方法はありますか?その中の識別子?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

私は実際にあなたが間違っていることを静かに確信していませんが、次のプログラムは正常に動作します:

        .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 に答える
2

printf は可変引数を取るため、名前のない引数をレジスタではなくスタックで受け取ります。つまり、名前付きの「format」引数は最初の引数レジスタに渡されますが、後続の引数はスタックに渡されます。

SPARC ABIの「コード例」セクションの「変数引数リスト」セクションを参照してください。

于 2011-05-23T05:56:27.333 に答える