把主程序的参数复制到栈顶 初始化寄存器(包括堆栈指针 $ sp, 帧指针 $ fp, 全局指针$gp ) 跳转到启动进程复制参数到寄存器并调用主函数main主函数返回时,通过系统调用exit终止程序 以上就是程序运行的一次简单漫游。这里我们还要提点一下Java程序和JVM,实在太重要了。下图展示了Java翻译和运行步骤: Java程序首先被...
与sp指针配合,构成栈帧,调试回溯时需要。类似于x86中的bp.可参考 http://lambda.uta.edu/cse5317/notes/node34.html
入口参数为num,没有返回参数,有一个局部数组,被调用过程为compare,因此,其栈帧中除了保留所用的保存寄存器外,必须保留返回地址(因为set_array不是叶过程) 是否保存$fp要看具体情况,如果确保后面都不用到$fp,则可以不保存,但为了保证...
$8..$15:($t0-$t7)临时寄存器,子程序可以应用它们而不用保留。 $16..$23:($s0-$s7)保存寄存器,在过程调用过程当中须要保留(被调用者保存和恢复,还包括$fp和$ra),MIPS 供给了临时寄存器和保存寄存器,这样就减少了寄存器溢出(spilling,即将不经常使用的变量放到存储器的过程), 编译器在编译一个叶(leaf)过...
继续单步执行,看到将$sp寄存器的值赋值给了$fp寄存器,这时候堆栈寄存器和帧指针同时指向当前调用栈的栈顶。 继续单步执行,0x40079c地址处,我们在sum函数的入口处下一个断点,由于mips架构的分支延迟机制,nop指令就是一个分支延迟槽。执行完nop指令之后,接下来我们会步进到sum函数中,进入sum函数之后,我们再来观察$sp...
即$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中。用于支持...
mips fp指针在MIPS指令集中,没有专门的浮点指针(floating-point pointer)指令。MIPS是一种基于精简指令集(RISC)架构的处理器,其指令集主要关注的是整数和逻辑运算,而不是浮点运算。 然而,MIPS指令集中包含一些用于浮点运算的指令,如加法、减法、乘法、除法等。这些指令可以用于处理单精度浮点数(32位)和双精度浮点数...
30:(fp)存放栈帧指针寄存器。为支持MIPS架构的GNU C编译器保留的,MIPS公司自己的C编译器没有使用,而把这个寄存器当作保存寄存器使用( 31:(ra)存放返回地址。MIPS有个jal(jump-and-link,跳转并链接)指令,在跳转到某个地址时,把下一条指令的 地址放到ra中,用于支持子程序调用。例如,调用程序把参数放到a0~a3,然...
28~30、$gp,$sp,$fp:分别用作全局指针、栈指针、栈帧指针的寄存器 31,$ra:用于存放函数的返回地址 R格式(寄存器格式,Register) R格式机器码 算术/逻辑运算指令大多使用R 指令格式。例如带符号加法指令,汇编语言的书写形式为: add $rd,$rs,$rt