随后,sp(栈指针)被赋值给s8,这一操作在函数执行过程中用于访问和操作局部变量。在第4至15行,fun函数实现了加法功能,并将结果保存在v0寄存器中,为后续操作提供了数据支持。函数执行完毕后,s8的值被重新赋给sp,同时从栈上恢复了s8寄存器的原始值,确保了程序的正确恢复。最后,sp指针被恢复至调用fun函数前...
在函数调用过程中,MIPS 使用堆栈指针$sp和帧指针$fp来管理函数的局部变量和保存调用环境。截图中的指令说明了函数进入时对堆栈的操作: addiu $sp, $sp, -0x20:这条指令将栈指针$sp向下移动 32 个字节,以为当前函数调用创建新的栈帧。这是典型的函数进入操作,用于为局部变量和保存寄存器分配空间。 随后,我们看到...
$gp: 静态数据的全局指针寄存器 $sp: 堆栈指针寄存器 $fp: 帧指针寄存器-保存过程帧的第一个字 $ra: 返回地址寄存器 过程的调用一般用到指令: jal:调用过程,跳转和链接这里注意 jal 和普通的 j 还是不同的,j只是简单地跳转到某地址执行指令,但是jal还附带了保存PC下条指令地址到$ra等操作 jr:过程返回,寄存...
编译器在编译函数时,能够计算出其局部变量以及参数需要的存储空间,在函数前言部分通过偏移sp指针为这些变量分配空间。例如funB()分配的栈空间为:ra+fp+local variables+arguments。 /// intfun5(inta,intb,intc,intd,inte) { intabc = e; returnfun4(a,b,c,d)+ abc; } intmain(void) { intret; inta...
在X86汇编中,一个函数的栈帧范围是由栈底指针ebp/rbp和栈顶指针sp共同决定的。但MIPS汇编中不含栈底指针,一个函数的栈帧是由函数自身的的栈顶指针sp和其调用者的栈顶指针共同决定的,如下图所示。 函数栈帧示意图 需要注意的是,在实际的汇编代码中,调用者的sp往往保存在寄存器fp中。
有一句lw $ra,0x3c($sp)的汇编,我们将距离栈顶0x3c的位置放成上面提到的lw $fp,0x38($sp)指令...
其实,移植ST比想象的要简单很多,最关键的就是实现setjmp/longjmp,也就是保存寄存器和恢复寄存器,所以...
28~30、$gp,$sp,$fp:分别用作全局指针、栈指针、栈帧指针的寄存器 31,$ra:用于存放函数的返回地址 R格式(寄存器格式,Register) R格式机器码 算术/逻辑运算指令大多使用R 指令格式。例如带符号加法指令,汇编语言的书写形式为: add $rd,$rs,$rt
fclose(fp); } 编译 ./mips-linux-gcc -static /home/tigerortiger/study/mips_stack/stack.c -o stack 文件分析 1、首先查看文件信息,可以看到是mips32 架构 2、根据查看mips_stack.c 的源码或者运行文件可以知道,main()函数会读取passwd 文件,并且将文件的内容种存入局部变量buf 中,而buf 仅为256字节,如...
29:(sp)堆栈指针寄存器。MIPS硬件并不直接支持堆栈,你可以把它用于别的目的,但为了使用别人的程序或让别人使用你的程序, 还是要遵守这个约定的,但这和硬件没有关系。 30:(fp)存放栈帧指针寄存器。为支持MIPS架构的GNU C编译器保留的,MIPS公司自己的C编译器没有使用,而把这个寄存器当作保存寄存器使用( ...