0

これを解決するために、私は C を理解しています。私はまだアセンブリの初心者なので、ここで少し問題が発生しています。

複数の引数を取るのに問題があります。そうする必要がある場合はそれらを数えて、アセンブリコードでフォーマット引数を使用してください。

多くの引数を持つ文字列にいくつかのバイトを追加しようとしています。最初の 2 つの引数をスタックに置く方法は知っていますが、最初の後の他の引数は形式 (%s、%d、%c など) であり、最初の引数は変数 i であると想定されているものです。に書きたい。C では、標準 main に引数-counter があります。ここでも引数を数えたいと思うかもしれません!? どうすればそれを行うことができますか?

     .globl minisprintf

# Name:         minisprintf
# Synopsis:     A simplified sprintf
# C-signature:      int minisprintf(unsigned char *res, unsigned char *format, ...);
# Registers:        AL: for characters      
#                 %ECX: first argument, res
#                 %EDX: second argument, args
#



minisprintf:                    # minisprintf

    pushl       %ebp            # start of
    movl        %esp, %ebp      # function

    movl        8(%ebp), %ecx   # first argument
    movl        12(%ebp), %edx  # second argument
                                # other arguments
                                # checking last byte of string res
4

2 に答える 2

1

可変個引数関数は C の機能であるため、関心のあるアーキテクチャ/ABI のva_startva_arg、およびのオープンソース実装を確認するva_endことをお勧めします。

-like 関数の明示的な引数カウントは必要ありませんprintf。その情報はフォーマット文字列に埋め込まれているためです。期待される可変引数の数とタイプは、フォーマット指定子の数と詳細によって指定されます。

これらすべてを正しく機能させるには、ABI のプロシージャ コールの側面が非常に重要な詳細であることを理解する必要があります。たとえば、浮動小数点と整数の引数は同じスタックに送られますか、それとも一部はレジスタに渡されますか? va_arg同等のものが常に適切な型に対して適切なタイミングで適切なものを取得できるようにするには、型をどのサイズに昇格させる必要がありますか? 等々...

于 2013-05-05T14:30:58.043 に答える