上でリンクした完全なコードを見ることから、あなたが扱っている2つの問題があります。
1)標準のMIPS o32呼び出し規約に引数(特に4つ以上)を使用するようにスタックが適切に設定されていません。他の答えは、これを助けるためにあなたを指し示すのに良い仕事をします。
2)使用している「printf」は、標準の呼び出し規約をまったく使用していません。コメントが表示された場合:
## printf--
## A simple printf-like function. Understands just the basic forms
## of the %s, %d, %c, and %% formats, and can only have 3 embedded
## formats (so that all of the parameters are passed in registers).
## If there are more than 3 embedded formats, all but the first 3 are
## completely ignored (not even printed).
## Register Usage:
## $a0,$s0 - pointer to format string
## $a1,$s1 - format argument 1 (optional)
## $a2,$s2 - format argument 2 (optional)
## $a3,$s3 - format argument 3 (optional)
## $s4 - count of formats processed.
## $s5 - char at $s4.
## $s6 - pointer to printf buffer
スタックに何も渡されることは期待されていません。($ s0-6はスタックに関連していないことに注意してください)。この関数に$a0->フォーマット文字列と3つの引数($ a1、$ a2、および$ a3)を提供できます。これらのコメントは、$ s0〜 $ s6を破壊することを示唆していることに注意してください。ただし、不完全なコードから、トレースせずにどれだけ復元されるかを言うことができます。要するに、あなたが見つけたこのprintfは便利かもしれませんが、あなたが学ぶべきスタック規則を使用しておらず、かなり制限されています。あなたがそれを使用する許可を持っていると仮定して、変更する許可を取得することについて見て、そしてただインターフェースを何か正気に書き直してください。一度に3つ以上の変数を出力する必要がある場合は、関数を複数回呼び出す必要があることに注意してください(そうであれば、ラッパーを作成するだけです)。