《微处理器体系结构》-第六章 第二讲 MIPS指令编程
文章目录
前言
本课程是笔者在大三学年所学的专业选修课,以此文章来记录和总结自己学习的过程,仅供诸位参考。本课教材选用美国作家
戴维•哈里斯的《数字设计和计算机体系结构》
课程涉及范围为本书6到8章部分内容。
一、编程
不必认为汇编语言编程十分困难。相反,我们已熟知的高级语言(C或Java)所涉及的抽象层次更高。本文将讲解如何将高级语言常见的算术和逻辑操作、if/else语句、for和while循环、数组下标和函数调用等常见的软件结构转换为MIPS汇编代码。
1.算术/逻辑指令
这类指令是实现高级语言结构的基础,MIPS定义了大量这类指令。
1.1 逻辑指令
MIPS逻辑操作包括了与、或、异或、或非(and、or、xor、nor)。这些R指令对两个源寄存器和一个目的寄存器进行按位操作。图中给出实例,指令执行结果存储在目的寄存器rd中。
MIPS不提供NOT指令,但 A NOR 0=NOT A,使用NOR指令代替了NOT指令的功能。
逻辑运算有着一些其他功能,如and指令可以用于屏蔽某些位,如上例中的s2就被屏蔽了最低两个字节(即最右边的16位二进制数)后,写入了s3中。
or指令可以用于组合两个寄存器,如0x34A80000 OR 0x00001234 = 0x34A81234,就将两个数据的高4位和低4位组合起来了。
1.2 移位指令
MIPS移位操作可以将寄存器中的值左移或者右移最多31位。移位操作指令有:逻辑左移指令sll,逻辑右移指令srl和算术右移指令sra,这些指令可以将操作数乘或除以2的整数次幂。
可见,sll指令是对低位补零,srl则是对高位补零,而sra则是高位补符号位。
MIPS也提供可变以为指令,即将上述指令中的立即数换为寄存器,格式为:sllv rd,rt,rs
。rt中保存待移位的值,rs则给出了位移的位数。可变逻辑指令分别是:sllv,srlv和srav。
1.3 常数赋值
我们可以使用addi指令将16位的常数赋值到寄存器内。
为什么addi只能赋值16位常数?因为I类型指令的imm只有16位
为了赋值32位常数,可以先使用一条装入高位立即数指令,将16位的立即数装入32位寄存器的高16位中,再使用ori指令将另一个16位立即数合并到该寄存器的低16位中。