
模拟器与汇编程序设计论文.doc
53页华中科技大学计算机科学与技术学院 C语言课程设计报告华中科技大学计算机科学与技术学院C语言课程设计报告 题目: 模拟器与汇编程序设计目 录一、系统需求分析 1二、总体设计 6三、数据结构设计 8四、详细设计 10五、系统实现 14六、运行测试与结果分析 47七、总结 49八、参考文献 50九、指导教师评语 51I华中科技大学计算机科学与技术学院 C语言课程设计报告一、 系统需求分析本系统根据给出的指令集架构ISA编程实现一个模拟器和汇编程序,能够使用汇编程序将由给定指令集和指令格式编写的汇编源程序翻译成目标程序,并能够在模拟器上运行汇编后的目标程序,得到正确结果系统还包含两个汇编源程序,供汇编程序翻译成目标代码,即机器码汇编源程序1的功能是求出1+2+3+…+100,并且正确输出运算结果汇编源程序2的功能是将字符串“Simulator and Assembler”拷贝到另一个字符串中,并且输出另一个字符串,源程序可以自动判断字符串尾部并结束拷贝以及结束输出而不用考虑字符串长度的设定。
具体内容如下:1. 用C语言编制汇编程序,将此简单计算机的汇编源程序翻译成目标代码,即机器码为了测试所编制汇编程序的正确性,需用以上介绍的指令集编写两个汇编源程序,汇编源程序的功能要求为: 求1+2+3+…+100,并输出运算结果② 求将“Simulator and Assembler”拷贝复制到新串并输出运算结果串并输出运算结果其中,32条指令以及伪指令和它们的功能如下:(1) 停机指令:HLT功能:终止程序运行2) 无条件转移指令:JMP label功能:将控制转移至标号label处,执行标号label后的指令3) 比较运算转移指令:CJMP label功能:如果程序状态字中比较标志位c的值为1(即关系运算的结果为真),则将控制转移至标号label处,执行标号label后的指令;否则,顺序往下执行4) 溢出转移指令:OJMP功能:如果程序状态字中比较标志位o的值为1(即算术运算的结果发生溢出),则将控制转移至标号label处,执行标号label后的指令;否则,顺序往下执行5) 调用子程序指令:CALL label功能:将通用寄存器A~G、程序状态字PSW、程序计数器PC中的值保存到ES,然后调用以标号label开始的子程序,将控制转移至标号label处,执行标号label后的指令。
6) 子程序返回指令:RET功能:将ES中保存的通用寄存器A~Z、程序状态字PSW和程序字数器PC的值恢复,控制转移到子程序被调用的地方,执行调用指令的下一条指令7) 入栈指令:PUSH reg0功能:将通用寄存器reg0的值压入堆栈SS,reg0可以是A~G和Z八个通用寄存器之一8) 出栈指令:POP reg0功能:从堆栈SS中将数据出栈到寄存器reg0,reg0可以是A~G七个通用寄存器之一,但不能是通用寄存器Z9) 取字节数据指令:LOADB reg0 symbol功能:从字节数据或字节数据块symbol中取一个字节的数据存入寄存器reg0,所取的字节数据在数据块symbol中的位置由寄存器G的值决定用C的语法可将此指令的功能描述为: reg0 = symbol[G]例如,假设用伪指令定义了以下字节数据块num: BYTE num[10] = {5,3,2,8,6,9,1,7,4,0}如果要将字节数据块num中第5个单元的值(即下标为4的元素)取到寄存器C,指令如下: LOADI G 5 LOADB C num后面的指令LOADW、STOREB和STOREW在操作上与此指令类似。
10) 取双字节数据指令:LOADW reg0 symbol功能:从双字节数据或双字节数据块symbol中取一个双字节的数据存入寄存器reg0,所取的双字节数据在数据块symbol中的位置由寄存器G的值决定11) 存字节数据指令:STOREB reg0 symbol功能:将寄存器reg0的值存入字节数据或字节数据块symbol中的某个单元,存入单元的位置由寄存器G的值决定用C的语法可将此指令的功能描述为: symbol[G] = reg0(12) 存双字节数据指令:STOREW reg0 symbol功能:将寄存器reg0的值存入双字节数据或双字节数据块symbol中的某个单元,存入单元的位置由寄存器G的值决定13) 取立即数指令:LOADI reg0 immediate功能:将指令中的立即数immediate存入寄存器reg0立即数被当作16位有符号数,超出16位的高位部分被截掉例如: LOADI B 65535寄存器B的值为-1 LOADI B 65537寄存器B的值为1。
14) 空操作指令:NOP功能:不执行任何操作,但耗用一个指令执行周期15) 控制台输入指令:IN reg0 0功能:从输入端口(即键盘输入缓冲区)取一个字符数据,存入寄存器reg016) 控制台输出指令:OUT reg0 15功能:将寄存器reg0的低字节作为字符数据输出到输出端口(即显示器)17) 加运算指令:ADD reg0 reg1 reg2功能:将寄存器reg1的值加上reg2的值,结果存入寄存器reg0如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为018) 加立即数指令:ADDI reg0 immediate功能:将寄存器reg0的值加上立即数immediate,结果仍存入寄存器reg0如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为019) 减运算指令:SUB reg0 reg1 reg2功能:将寄存器reg1的值减去reg2的值,结果存入寄存器reg0。
如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为020) 减立即数指令:SUBI reg0 immediate功能:将寄存器reg0的值减去立即数immediate,结果仍存入寄存器reg0如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为021) 乘运算指令:MUL reg0 reg1 reg2功能:将寄存器reg1的值乘以reg2的值,结果存入寄存器reg0如果结果超过16位有符号数的表示范围,将发生溢出,使程序状态字的溢出标志位o置为1;如果未发生溢出,则使程序状态字的溢出标志位o置为022) 除运算指令:DIV reg0 reg1 reg2功能:将寄存器reg1的值除以reg2的值,结果存入寄存器reg0,这里进行的是整数除运算如果寄存器reg2的值为零,将发生除零错23) 按位与运算指令:AND reg0 reg1 reg2功能:将寄存器reg1的值与reg2的值进行按位与运算,结果存入寄存器reg0。
24) 按位或运算指令:OR reg0 reg1 reg2功能:将寄存器reg1的值与reg2的值进行按位或运算,结果存入寄存器reg025) 按位异或运算指令:NOR reg0 reg1 reg2功能:将寄存器reg1的值与reg2的值进行按位异或(按位加)运算,结果存入寄存器reg026) 按位取反运算指令:NOTB reg0 reg1功能:将寄存器reg1的值按位取反后,结果存入寄存器reg027) 算术左移运算指令:SAL reg0 reg1 reg2功能:将寄存器reg1的值算术左移reg2位,结果存入寄存器reg0在进行算术左移时,低位空位用0填充28) 算术右移运算指令:SAR reg0 reg1 reg2功能:将寄存器reg1的值算术右移reg2位,结果存入寄存器reg0在进行算术右移时,高位空位用符号位填充29) 相等关系运算指令:EQU reg0 reg1功能:将两个寄存器reg0和reg1的值进行相等比较关系运算:reg0 == reg1,关系运算的结果为逻辑真或逻辑假,存入程序状态字中的比较标志位c。
30) 小于关系运算指令:LT reg0 reg1功能:将两个寄存器reg0和reg1的值进行小于关系运算:reg0 < reg1,关系运算的结果为逻辑真或逻辑假,存入程序状态字中的比较标志位c31) 小于等于关系运算指令:LTE reg0 reg1功能:将两个寄存器reg0和reg1的值进行小于等于关系运算:reg0 <= reg1,关系运算的结果为逻辑真或逻辑假,存入程序状态字中的比较标志位c32) 比较标志位取反指令:NOTC功能:将程序状态字中的比较标志位c求反,即将逻辑真变为逻辑假,将逻辑假变为逻辑真33) 字节数据定义伪指令:BYTE symbol[n] = {...} 蓝色字体部分为可选项 或:BYTE symbol[n] = "..." 蓝色字体部分为可选项功能:定义长度为1字节的字节型数据或数据块,字节型数据块类似于C的字符数组34) 字数据定义伪指令:WORD symbol[n] = {...} 蓝色字体部分为可选项功能:定义长度为2字节的双字节型数据或数据块,双字节型数据块类似于C的整型数组(16位系统)。
2. 用C语言编制一个模拟器,能够模拟此简单计算机执行汇编程序生成的目标代码,得到运行结果注:编写好编译程序和模拟器后,再用八皇后程序检验二、总体设计本系统分为3个部分:汇编程序,模拟器,汇编源程序系统通过汇编程序将汇编源程序翻译成目标程序,即目标代码,再在模拟器上运行该目标程序,从而得到正确的结果首先对于第一部分——汇编程序该程序分3步将汇编源程序翻译成目标代码第一:整体。












