MIPS汇编语言栈操作实现字符串字符交换的问题咨询
关于你代码的寄存器入栈逻辑和其他问题说明
寄存器入栈正确性
你当前入栈备份的$t0/$t1/$t2/$t3/$t6都是函数内部会修改的临时寄存器,这部分选择完全正确:
- MIPS调用约定中,临时寄存器(
$t0~$t9)默认由调用者负责保存,你作为被调用者主动对修改过的临时寄存器做入栈备份、出栈恢复,不会对调用方的寄存器上下文造成破坏,逻辑没有问题。
其他需要注意的代码问题
- 参数读取逻辑需和调用方压栈顺序匹配:你当前从
20($sp)、24($sp)读取参数的偏移,是基于连续压入5个共20字节寄存器的前提,只要调用该函数时是先压第二个字符串地址、再压第一个字符串地址,读取逻辑就是正确的。 - 返回前的参数栈清理逻辑要和调用约定匹配:你末尾的
addi $sp, $sp, 8是被调用者清理2个共8字节参数的逻辑,如果你采用MIPS默认的「调用者清理参数」约定,这行代码需要删掉,否则会出现栈指针重复偏移导致的栈错误。 - 当前代码固定交换6个字符,需要确保你传入的两个字符串长度都不小于6,否则会出现内存越界访问的问题。
- 如果你后续要在该函数内部调用其他子函数,需要额外对
$ra寄存器做入栈备份,避免子函数执行时覆盖$ra的值导致无法正确返回。
内容的提问来源于stack exchange,提问作者Looprachaun
相关产品推荐
相关产品推荐

