1

_format 文字列で printf を呼び出そうとしていますが、両方の文字列を出力する代わりにエラーが発生します。_printStr 関数を追加する前にプログラムを動作させることができたので、両方が出力されない理由が本当にわかりません。各文字列を個別に出力することもでき、問題なく動作します (12(%ebp) と 16(%ebp) を使用)。これは私が持っているコードです:

            .text
            .globl      _main
_string:    .ascii      "Hello\0" 
_string2:   .ascii      " World\0" 
_format:    .ascii      "%s %s\0"


_main: // push params, call fn, clear params, return 

            pushl      $_string2 
            pushl      $_string                 
            call      _printStr
            addl       $8, %esp
            ret

//function to print a string passed to it on the stack
_printStr:
            push        %ebp               # save old frame ptr
            movl        %esp, %ebp     # set frame ptr
            pushl       8(%ebp) 
            pushl       12(%ebp) 
            pushl       _format
            call _printf
            addl        $12, %esp          # clear params from stack
            leave
            ret

お時間をいただきありがとうございます。

4

2 に答える 2

2

の最初のパラメータとして不明な文字列を渡さないでくださいprintf。常に既知の書式指定子を使用してください。可能であればリテラルを使用することをお勧めします。文字列を出力するために使用する場合はprintf、次のようにします。

_simpleformat:  .ascii      "%s\0"

...

                pushl       8(%ebp)
                pushl       _simpleformat
                call _printf
                addl        $8, %esp
于 2012-11-18T20:48:19.197 に答える
1

$の標識がありませんpushl _formatpushl $_formatアドレスを渡したいので、読む必要があります。ちなみに、2 つの単語を逆の順序で渡すこともできます" World Hello"。また、改行がありませんが、余分なスペースがあります。最後に、セクションに文字列定数を配置すること.textはベスト プラクティスではありません。動作中の修正済みバージョンを参照してください(ideone には不要ですが、システムではおそらく必要な先頭のアンダースコアをいくつか削除したことに注意してください)

于 2012-11-18T21:38:42.670 に答える