1、 C C 语言课程设计报告语言课程设计报告 题目: 模拟器和汇编程序的设计 专 业: 计算机科学与技术 班 级: 学 号: 姓 名: 成 绩: 指导教师: 完成日期:完成日期: 2012 年年 10 月月 15 日日 I 目目 录录 一、系统需求分析 .1 二、总体设计 6 三、数据结构设计 .7 四、详细设计 9 五、系统实现 13 六、运行测试与结果分析 42 七、总结 44 八、参考文献 45 九、指导教师评语 . 46 第 1 页 共 53 页 一、系统需求分析一、系统需求分析 Simulator and Assembler 1. 用 C 语言编制汇编程序, 将此简单计算机的汇编源程序
2、翻译成目标代码, 即机器码。为了测试所编制汇编程序的正确性,需用以上介绍的指令集编写两个 汇编源程序,汇编源程序的功能要求为: 求 1+2+3+100,并输出运算结果。 求将” Simulator and Assembler”拷贝复制到新串并输出运算结果。 串并输出运算结果。 其中,32 条指令以及伪指令和它们的功能如下: (1) 停机指令:HLT 功能:终止程序运行。 (2) 无条件转移指令:JMP label 功能:将控制转移至标号 label 处,执行标号 label 后的指令。 (3) 比较运算转移指令:CJMP label 功能:如果程序状态字中比较标志位 c 的值为 1(即关系运算
3、的结果为真), 则将控制转移至标号 label 处, 执行标号 label 后的指令; 否则, 顺序往下执行。 (4) 溢出转移指令:OJMP 功能:如果程序状态字中比较标志位 o 的值为 1(即算术运算的结果发生溢 出),则将控制转移至标号 label 处,执行标号 label 后的指令;否则,顺序往 下执行。 (5) 调用子程序指令:CALL label 功能:将通用寄存器 AG、程序状态字 PSW、程序计数器 PC 中的值保存到 ES,然后调用以标号 label 开始的子程序,将控制转移至标号 label 处,执行标 号 label 后的指令。 (6) 子程序返回指令:RET 功能:将
4、ES 中保存的通用寄存器 AZ、程序状态字 PSW 和程序字数器 PC 的 值恢复,控制转移到子程序被调用的地方,执行调用指令的下一条指令。 (7) 入栈指令:PUSH reg0 第 2 页 共 53 页 功能:将通用寄存器 reg0 的值压入堆栈 SS,reg0 可以是 AG 和 Z 八个通用 寄存器之一。 (8) 出栈指令:POP reg0 功能:从堆栈 SS 中将数据出栈到寄存器 reg0,reg0 可以是 AG 七个通用寄 存器之一,但不能是通用寄存器 Z。 (9) 取字节数据指令:LOADB reg0 symbol 功能:从字节数据或字节数据块 symbol 中取一个字节的数据存入寄
5、存器 reg0,所取的字节数据在数据块 symbol 中的位置由寄存器 G 的值决定。用 C 的 语法可将此指令的功能描述为: reg0 = symbolG 例如,假设用伪指令定义了以下字节数据块 num: BYTE num10 = 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 中
6、取一个双字节的数据存入寄 存器 reg0,所取的双字节数据在数据块 symbol 中的位置由寄存器 G 的值决定。 (11) 存字节数据指令:STOREB reg0 symbol 功能: 将寄存器reg0的值存入字节数据或字节数据块symbol中的某个单元, 存入单元的位置由寄存器 G 的值决定。用 C 的语法可将此指令的功能描述为: symbolG = reg0 (12) 存双字节数据指令:STOREW reg0 symbol 功能: 将寄存器 reg0 的值存入双字节数据或双字节数据块 symbol 中的某个 单元,存入单元的位置由寄存器 G 的值决定。 (13) 取立即数指令:LOADI reg0 immediate 功能:将指令中的立即数 immediate 存入寄存器 reg0。立即数被当作 16 位 有符号数,超出 16 位的高位部分被截掉。例如: LOADI B 65535 寄存器 B 的值