将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第20篇,我尽量每周四篇
本章将实现移动操作指令,首先在6.1节介绍了MIPS32指令集架构中定义的移动操作指令的格式、作用,接着在6.2节给出移动操作指令实现思路,介绍了修改后的数据流图、新出现的数据相关问题及其解决措施,并给出了修改后的OpenMIPS系统结构图。在6.3节列出了详细的修改过程。本章最后通过一个测试程序验证移动操作指令是否实现正确。
6.1 移动操作指令说明
MIPS32指令集架构中定义的移动操作指令共有6条:movn、movz、mfhi、mthi、mflo、mtlo,后4条指令涉及到了对特殊寄存器HI、LO的读写操作,截止到本章,我们的OpenMIPS处理器只实现了32个通用寄存器、以及PC,所有的指令也只是对32个通用寄存器进行操作,还没有涉及特殊寄存器,本章将实现HI、LO这两个特殊寄存器。
HI、LO寄存器用于保存乘法、除法结果。当用于保存乘法结果时,HI寄存器保存结果的高32位,LO寄存器保存结果的低32位;当用于保存除法结果时,HI寄存器保存余数,LO寄存器保存商。在后续“算术操作指令的实现”一章中,会进一步说明。
这6条移动操作指令的格式如图6-1所示。
从图6-1可知,这6条指令都是R类型指令,并且指令码都是6‘b000000,即均为SPECIAL类指令,同时,指令第6-10bit都为0,可以依据指令中0-5bit功能码的值判断是哪一种指令。各指令的用法及作用说明如下。
- 当功能码为6‘b001011时,表示是movn指令
指令用法为:movn rd, rs, rt
指令作用为:if rt ≠0 then rd <- rs,判断地址为rt的通用寄存器的值,如果不为零,那么将地址为rs的通用寄存器的值赋给地址为rd的通用寄存器,反之,保持地址为rd的通用寄存器不变。movn是Move Conditional on Not Zero的意思。
- 当功能码为6‘b001010时,表示是movz指令
指令用法为:movz rd, rs, rt
指令作用为:if rt = 0 then rd <- rs,与上面movn指令的作用正好相反,判断地址为rt的通用寄存器的值,如果为零,那么将地址为rs的通用寄存器的值赋给地址为rd的通用寄存器,反之,保持地址为rd的通用寄存器不变。movz是Move Conditional on Zero的意思。
- 当功能码为6‘b010000时,表示是mfhi指令
指令用法为:mfhi rd
指令作用为:rd <- hi,将特殊寄存器HI的值赋给地址为rd的通用寄存器。
- 当功能码为6‘b010010时,表示是mflo指令
指令用法为:mflo rd
指令作用为:rd <- lo,将特殊寄存器LO的值赋给地址为rd的通用寄存器。
- 当功能码为6‘b010001时,表示是mthi指令
指令用法为:mthi rs
指令作用为:hi <- rs,将地址为rs的通用寄存器的值赋给特殊寄存器HI。
- 当功能码为6‘b010011时,表示是mtlo指令
指令用法为:mtlo rs
指令作用为:lo <- rs,将地址为rs的通用寄存器的值赋给特殊寄存器LO。
自己动手写CPU之第六阶段(1)——移动操作指令说明