通过查看上面链接的完整代码,您正在处理两个问题。
1)您的堆栈没有正确设置以使用标准 MIPS o32 调用约定的参数(尤其是四个以上)。其他答案很好地指出了您对此的帮助。
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 个变量,则必须多次调用该函数并不是什么大问题(如果是,只需编写一个包装器)。