您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > duhongbin2
华中科技大学计算机科学与技术学院C语言课程设计报告I华中科技大学计算机科学与技术学院C语言课程设计报告题目:模拟器与汇编程序设计华中科技大学计算机科学与技术学院C语言课程设计报告II目录一、系统需求分析....................................................错误!未定义书签。二、总体设计.............................................................................................6三、数据结构设计....................................................................................8四、详细设计...........................................................................................10五、系统实现...........................................................................................14六、运行测试与结果分析......................................................................47七、总结...................................................................................................49八、参考文献...........................................................................................50九、指导教师评语..................................................................................51华中科技大学计算机科学与技术学院C语言课程设计报告第1页共51页一、系统需求分析本系统根据给出的指令集架构ISA编程实现一个模拟器和汇编程序,能够使用汇编程序将由给定指令集和指令格式编写的汇编源程序翻译成目标程序,并能够在模拟器上运行汇编后的目标程序,得到正确结果。系统还包含两个汇编源程序,供汇编程序翻译成目标代码,即机器码。汇编源程序1的功能是求出1+2+3+…+100,并且正确输出运算结果。汇编源程序2的功能是将字符串“SimulatorandAssembler”拷贝到另一个字符串中,并且输出另一个字符串,源程序可以自动判断字符串尾部并结束拷贝以及结束输出而不用考虑字符串长度的设定。具体内容如下:1.用C语言编制汇编程序,将此简单计算机的汇编源程序翻译成目标代码,即机器码。为了测试所编制汇编程序的正确性,需用以上介绍的指令集编写两个汇编源程序,汇编源程序的功能要求为:求1+2+3+…+100,并输出运算结果。②求将“SimulatorandAssembler”拷贝复制到新串并输出运算结果。串并输出运算结果。其中,32条指令以及伪指令和它们的功能如下:(1)停机指令:HLT功能:终止程序运行。(2)无条件转移指令:JMPlabel功能:将控制转移至标号label处,执行标号label后的指令。(3)比较运算转移指令:CJMPlabel功能:如果程序状态字中比较标志位c的值为1(即关系运算的结果为真),则将控制转移至标号label处,执行标号label后的指令;否则,顺序往下执行。(4)溢出转移指令:OJMP功能:如果程序状态字中比较标志位o的值为1(即算术运算的结果发生溢出),则将控制转移至标号label处,执行标号label后的指令;否则,顺序往下执行。(5)调用子程序指令:CALLlabel功能:将通用寄存器A~G、程序状态字PSW、程序计数器PC中的值保存到ES,然后调用以标号label开始的子程序,将控制转移至标号label处,执行标华中科技大学计算机科学与技术学院C语言课程设计报告第2页共51页号label后的指令。(6)子程序返回指令:RET功能:将ES中保存的通用寄存器A~Z、程序状态字PSW和程序字数器PC的值恢复,控制转移到子程序被调用的地方,执行调用指令的下一条指令。(7)入栈指令:PUSHreg0功能:将通用寄存器reg0的值压入堆栈SS,reg0可以是A~G和Z八个通用寄存器之一。(8)出栈指令:POPreg0功能:从堆栈SS中将数据出栈到寄存器reg0,reg0可以是A~G七个通用寄存器之一,但不能是通用寄存器Z。(9)取字节数据指令:LOADBreg0symbol功能:从字节数据或字节数据块symbol中取一个字节的数据存入寄存器reg0,所取的字节数据在数据块symbol中的位置由寄存器G的值决定。用C的语法可将此指令的功能描述为:reg0=symbol[G]例如,假设用伪指令定义了以下字节数据块num:BYTEnum[10]={5,3,2,8,6,9,1,7,4,0}如果要将字节数据块num中第5个单元的值(即下标为4的元素)取到寄存器C,指令如下:LOADIG5LOADBCnum后面的指令LOADW、STOREB和STOREW在操作上与此指令类似。(10)取双字节数据指令:LOADWreg0symbol功能:从双字节数据或双字节数据块symbol中取一个双字节的数据存入寄存器reg0,所取的双字节数据在数据块symbol中的位置由寄存器G的值决定。(11)存字节数据指令:STOREBreg0symbol功能:将寄存器reg0的值存入字节数据或字节数据块symbol中的某个单元,存入单元的位置由寄存器G的值决定。用C的语法可将此指令的功能描述为:symbol[G]=reg0(12)存双字节数据指令:STOREWreg0symbol功能:将寄存器reg0的值存入双字节数据或双字节数据块symbol中的某个单元,存入单元的位置由寄存器G的值决定。华中科技大学计算机科学与技术学院C语言课程设计报告第3页共51页(13)取立即数指令:LOADIreg0immediate功能:将指令中的立即数immediate存入寄存器reg0。立即数被当作16位有符号数,超出16位的高位部分被截掉。例如:LOADIB65535寄存器B的值为-1。LOADIB65537寄存器B的值为1。(14)空操作指令:NOP功能:不执行任何操作,但耗用一个指令执行周期。(15)控制台输入指令:INreg00功能:从输入端口(即键盘输入缓冲区)取一个字符数据,存入寄存器reg0。(16)控制台输出指令:OUTreg015功能:将寄存器reg0的低字节作为字符数据输出到输出端口(即显示器)。(17)加运算指令:ADDreg0reg1reg2功能:将寄存器reg1的值加上reg2的值,结果存入寄存器reg0。如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为0。(18)加立即数指令:ADDIreg0immediate功能:将寄存器reg0的值加上立即数immediate,结果仍存入寄存器reg0。如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为0。(19)减运算指令:SUBreg0reg1reg2功能:将寄存器reg1的值减去reg2的值,结果存入寄存器reg0。如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为0。(20)减立即数指令:SUBIreg0immediate功能:将寄存器reg0的值减去立即数immediate,结果仍存入寄存器reg0。如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为0。(21)乘运算指令:MULreg0reg1reg2功能:将寄存器reg1的值乘以reg2的值,结果存入寄存器reg0。如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o华中科技大学计算机科学与技术学院C语言课程设计报告第4页共51页置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为0。(22)除运算指令:DIVreg0reg1reg2功能:将寄存器reg1的值除以reg2的值,结果存入寄存器reg0,这里进行的是整数除运算。如果寄存器reg2的值为零,将发生除零错。(23)按位与运算指令:ANDreg0reg1reg2功能:将寄存器reg1的值与reg2的值进行按位与运算,结果存入寄存器reg0。(24)按位或运算指令:ORreg0reg1reg2功能:将寄存器reg1的值与reg2的值进行按位或运算,结果存入寄存器reg0。(25)按位异或运算指令:NORreg0reg1reg2功能:将寄存器reg1的值与reg2的值进行按位异或(按位加)运算,结果存入寄存器reg0。(26)按位取反运算指令:NOTBreg0reg1功能:将寄存器reg1的值按位取反后,结果存入寄存器reg0。(27)算术左移运算指令:SALreg0reg1reg2功能:将寄存器reg1的值算术左移reg2位,结果存入寄存器reg0。在进行算术左移时,低位空位用0填充。(28)算术右移运算指令:SARreg0reg1reg2功能:将寄存器reg1的值算术右移reg2位,结果存入寄存器reg0。在进行算术右移时,高位空位用符号位填充。(29)相等关系运算指令:EQUreg0reg1功能:将两个寄存器reg0和reg1的值进行相等比较关系运算:reg0==reg1,关系运算的结果为逻辑真或逻辑假,存入程序状态字中的比较标志位c。(30)小于关系运算指令:LTreg0reg1功能:将两个寄存器reg0和reg1的值进行小于关系运算:reg0reg1,关系运算的结果为逻辑真或逻辑假,存入程序状态字中的比较标志位c。(31)小于等于关系运算指令:LTEreg0reg1功能:将两个寄存器reg0和reg1的值进行小于等于关系运算:reg0=reg1,关系运算的结果为逻辑真或逻辑假,存入程序状态字中的比较标志位c。(32)比较标志位取反指令:NOTC功能:将程序状态字中的比较标志位c求反,即将逻辑真变为逻辑假,将逻华中科技大学计算机科学与技术学院C语言课程设计报告第5页共51页辑假变为逻辑真。(33)字节数据定义伪指令:BYTEsymbol[n]={...}蓝色字体部分为可选项或:BYTEsymbol[n]=...蓝色字体部分为可选项功能:定义长度为1字节的字节型数据或数据块,字节型数据块类似于C的字符数组。(34)字数据定义伪指令:WORDsymbol[n]={...}蓝色字体部分为可选项功能:定义长度为2字节的双字节型数据或数据块,双字节型数据块类似于C的整型数组(16位系统)。2.用C语言编制一个模拟器,能够模拟此简单计算机执行汇编程序生成的目标代码,得到运行结果。注:编写好编译程序和模拟器后,再用八皇后程序检验。华中科技大学计算机科学与技术学院C语言课程设计报告第6页共51页二、总体设计本系统分为3个部分:汇编程序,模拟器,汇编源程序。系统通过汇编程序将汇编源程序翻译成目标程序,即目标代码,再在模拟器上运行该目标程序,从而得到正确的结果。首先对于第一部分——汇编程序。该程序分3步将汇编源程序翻译成目标代码。第一:整体扫描一次汇编源程序,去掉汇编源代码里面的空行和注释,并且对于伪指令,建立2个链表分别用来存放标号以及变量。其中标号链表里要存放标号的名称以及所在行数(偏
本文标题:duhongbin2
链接地址:https://www.777doc.com/doc-1258 .html