从高级语言到汇编语言(MIPS)
C语言是如何转化为汇编语言的?这一步在电脑中是由汇编程序完成的,但是了解C语言到汇编语言的转换过程有利于我们更好的编写出性能更加优异的程序,因此下面我将逐步介绍从C到MIPS的核心思想和实现步骤。
一、存储结构
核心:在MIPS中,所有的操作数必须来自于寄存器
1、寄存器和存储器的信息沟通
我们可以将存储结构分为寄存器和存储器两个部分。存储器是一个巨大的仓库,存储着运算所需要的全部数据;而寄存器就是我们的工作台,我们只能在工作台上进行工作。由于工作台上的空间有限,所以我们必须将不用的东西放回仓库,即从寄存器中放回存储器中,同理,从存储器中取出我们需要的数据也是必要的。
2、寄存器详解
①寄存器的大小:一个寄存器的大小是32位,由于我们经常以一个寄存器为单位进行数据的存取,因此我们也将一个一个寄存器的大小称为一个“字”。
②寄存器的个数:我们通常所说的32位、64位操作系统指的就是这个操作系统中寄存器的个数,在MIPS一类典型的现代计算机中一般有32个寄存器。至于为什么只有32个这么少,是因为往往“少就是快”。
③寄存器的命名:MIPS为了区分32个寄存器,对寄存器进行了分类和命名,如下所示:
符号 | 名称 | 用途 |
---|---|---|
$zero | 零寄存器 | 总是返回 0 |
$at | 汇编器临时寄存器 | 由汇编器用来处理某些汇编指令 |
$v0-$v1 | 函数返回值寄存器 | 用来存放函数的返回值 |
$a0-$a3 | 函数参数寄存器 | 用于传递函数参数 |
$t0-$t9 | 临时寄存器 | 用于保存临时数据,在函数调用时不保留其内容 |
$s0-$s7 | 保存寄存器 | 用于保存重要的局部变量,在函数调用时保留其内容 |
$k0-$k1 | 操作系统保留寄存器 | 用于操作系统的中断和异常处理 |
$gp | 全局指针寄存器 | 用于存储全局数据区域的大致中间位置的地址 |
$sp | 栈指针寄存器 | 用于指向当前栈顶的地址 |
$s8 | 帧指针寄存器 | 用于指向函数栈帧的开始 |
$ra | 返回地址寄存器 | 用于存储函数调用后的返回地址 |
其中部分寄存器的具体作用我将在下文阐明
二、MIPS指令基本格式
1、三操作数形式
大部分MIPS指令都符合如下形式
操作名 寄存器 1 , 寄存器 2 , 寄存器 3 操作名\quad 寄存器1,寄存器2,寄存器3