与sp指针配合,构成栈帧,调试回溯时需要。类似于x86中的bp.可参考 http://lambda.uta.edu/cse5317/notes/node34.html
把主程序的参数复制到栈顶 初始化寄存器(包括堆栈指针 $ sp, 帧指针 $ fp, 全局指针$gp ) 跳转到启动进程复制参数到寄存器并调用主函数main主函数返回时,通过系统调用exit终止程序 以上就是程序运行的一次简单漫游。这里我们还要提点一下Java程序和JVM,实在太重要了。下图展示了Java翻译和运行步骤: Java程序首先被...
由于不能随便移动栈指针,所以寄存器压栈和出栈时都要指定偏移量。 可以看到,mips架构中,在函数入口处以addiu $sp,-0x30来开辟栈桢,当程序运行到0x400770地址处时,$fp寄存器的值被保留到了栈上,$fp寄存器的值为0。 继续单步执行,看到将$sp寄存器的值赋值给了$fp寄存器,这时候堆栈寄存器和帧指针同时指向当前调用...
MIPS中一个栈帧空间为32位,也就是4个字节。栈帧中除了保留所用的保存寄存器外,还必须保留返回地址$ra,是否保存$fp要看具体情况。如果确保后面都用不到$fp,则可以不保存,但为了保证$fp的值不被后面的过程覆盖,通常应该保存$fp的值,初始化$fp时,$fp总是指向当前栈帧前一个字或者当前栈帧第一个字的...
是否保存$fp要看具体情况,如果确保后面都不用到$fp,则可以不保存,但为了保证$fp的值不被后面的过程覆盖,通常情况下,应该保存$fp的值,并给局部数组(int array[10]) 预留4×10=40个字节的空间。
即$fp,GNU MIPS C编译器使用了帧指针(frame pointer),而SGI的C编译器没有使用,而把这个寄存器当作保存寄存器使用($s8),这节省了调用和返回开销,但增加了代码生成的复杂性。 $31 即$ra,存放返回地址,MIPS有个jal(jump-and-link,跳转并 链接)指令,在跳转到某个地址时,把下一条指令的地址放到$ra中。用于支持...
即$fp,GNU MIPS C编译器使用了帧指针(frame pointer),而SGI的C编译器没有使用,而把这个寄存器当作保存寄存器使用($s8),这节省了调用和返回开销,但增加了代码生成的复杂性。 $31 即$ra,存放返回地址,MIPS有个jal(jump-and-link,跳转并 链接)指令,在跳转到某个地址时,把下一条指令的地址放到$ra中。用于支持...
30:(fp)存放栈帧指针寄存器。为支持MIPS架构的GNU C编译器保留的,MIPS公司自己的C编译器没有使用,而把这个寄存器当作保存寄存器使用( 31:(ra)存放返回地址。MIPS有个jal(jump-and-link,跳转并链接)指令,在跳转到某个地址时,把下一条指令的 地址放到ra中,用于支持子程序调用。例如,调用程序把参数放到a0~a3,然...
28($gp): 全局指针。一些运行系统维护这个指针来更方便的存取“static“和”extern”变量。 29($sp): 堆栈指针 30($s8/$fp): 第9个寄存器变量。子函数可以用来做桢指针 31($ra): 子函数的返回地 cp0:协处理器0,MIPS对CPU的控制用cp0完成
28~30、$gp,$sp,$fp:分别用作全局指针、栈指针、栈帧指针的寄存器 31,$ra:用于存放函数的返回地址 R格式(寄存器格式,Register) R格式机器码 算术/逻辑运算指令大多使用R 指令格式。例如带符号加法指令,汇编语言的书写形式为: add $rd,$rs,$rt