热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

模型计算机仿真程序设计与实现

 一、模型计算机及其仿真程序简介模型机计算机[1],是一台为了让学生更容易理解计算机的工作原理而设计的一台虚构的计算机,它是一台功能简单而完备的计算机,它的字长8位,指令系统共有2

 

一、模型计算机及其仿真程序简介

模型机计算机[1],是一台为了让学生更容易理解计算机的工作原理而设计的一台虚构的计算机,它是一台功能简单而完备的计算机,它的字长8位,指令系统共有28条指令,存储器的最大容量是256字节。具有寄存器寻址、立即数寻址、直接寻址、变址、基址等5种寻址方式。能够实现输入/输出、中断等复杂的功能。

编写模型计算机仿真程序的目的,就是能够在Windows操作系统支持下仿真执行模型计算机汇编语言程序。从而可以帮助学生在PC计算机上完成模型计算机汇编语言程序的过程实验。

仿真程序的任务主要有两个,一个是要把用模型计算机汇编语言所编写的源程序转换成二进制的目标程序。二是要在Windows下仿真执行模型计算机的目标程序。输入的是源程序ASM文件,输出的是OBJ目标文件和LST列表文件。整个转换过程需要对源程序进行两遍扫描,第一遍扫描确定源程序的每一行的偏移地址,把程序中定义的变量、标识符的偏移地址记录下来存储在符号表中。第二遍扫描分析指令,伪指令等的操作数,产生OBJ目标文件和LST列表文件。

二、模型计算机汇编程序设计与实现

1.第一遍扫描的设计与实现

第一遍扫描是对模型计算机汇编语言源程序中的词法进行处理。包括指令的正确性分析,伪指令的数据分析,地址计数器值产生。然后把把程序中定义的变量、标识符的偏移地址记录下来存储在符号表中。同时在第一遍扫描时把每一条指令的指令助忆符,操作数等相关内容存储在代码表中,为了第二遍扫描时使用。具体过程如图1所示。

 

《模型计算机仿真程序设计与实现》

 图1 第一遍扫描流程示意图

(1).地址计数器

地址计数器就是地址单元计数器。在对源程序开始第一遍扫描时,地址计数器初始化为零,在开始对源程序扫描时,每处理一条指令时,地址计数器就增加一个值,此值为该指令所需的字节数。所以,地址计数器可以看成是动态指向被扫描的源程序的相对位置的指针。也就是说地址计数器的内容即是当前正在被扫描的指令的偏移地址。对于指令和伪指令地址计数器的值产生有所不同。对伪指令ORG,地址计数器的值就重新设置成ORG所指示的值,表示从ORG所指示的地址开始计数。对DB或DS地址计数器的值就是地址计数器的当前值加上DB或DS后变量所占字节数,就是下一条指令的偏移地址。对于指令,地址计数器的值就是地址计数器的当前值加上指令的字节数,就是下一条指令的偏移地址。如此循环,直至第一遍扫描完成。

(2).符号表

在源程序中,用户可能定义常量、变量、标号等标识符,在第一遍扫描的过程中建立符号表,把用户定义的所有变量、标号标识符赋予当前地址计数器的值,对于常量只计算出表达式的值。

(3).机器指令表

    机器指令表是一张固定的表格,列出所有的指令助忆符及其所对应的目标代码的信息,其中包括指令的目标代码、指令的屏蔽字、指令操作数说明以及指令的长度等。由于机器指令表信息不能改变,所以设计成常量数组,确保在程序执行时,不会由于错误引起对它进行任何改变。

(4).代码表

    代码表设计成一个信息存储表,在第一遍扫描时,把每一条指令的指令助忆符、指令长度、变量或标号名、操作数个数及其类型,地址计数器的值等等信息保存在其中。在第二遍扫描时,不需要读取源程序文件,直接根据符号表、机器指令表和代码表把汇编语言指令翻译成目标代码,同时把指令目标代码和操作数的信息保存在代码表中,在执行界面上显示出来。

2、第二遍扫描的设计与实现

    第二遍扫描是对模型计算机汇编语言源程序中的数据和语法进行处理,产生目标代码。对于伪指令分析数据格式,预留内存单元或在内存单元中产生相应的值。对于可执行指令分析它的指令和操作数,产生目标代码,并且设置内存单元。第二遍扫描完成后,如果没有错误,将生成列表文件和目标代码文件。

具体过程如图2所示。

(1).伪指令的数据分析

    伪指令包括EQU、DB、DS、ORG的数据格式和数据值的分析。对于EQU可以使用表达式定义一个常量,如果EQU使用了表达式,表达式的某项由另一个EQU定义,则应该使用向后引用,即引用的某项必须先定义,然后才能引用。

    对于DB在第一遍扫描时只计算出数据的长度,从而设置地址计数器,在第二遍扫描时需要计算出每个字节的具体数据值。对于不同类型的数据如:二进制、八进制、十六进制、字符串等表达式计算出具体的值。如果表达式的某项由另一个EQU定义,则也应该使用向后引用。

    对于DS、ORG只要计算出操作数具体数据值设置地址计数器即可。

 

《模型计算机仿真程序设计与实现》

 图2 第二遍扫描流程示意图

(2).执行指令及其操作数分析

如果判断这一条语句是执行指令的话,先查找这一条执行指令的目标代码,然后分析操作数。首先需要分析这一条指令的是否存在操作数,如果有操作数,分析该指令操作数的类型是:寄存器数、内存数、立即数之一。其次,分析该指令操作数的格式是否正确。最后计算操作数的值,和目标代码组合在一起,设置内存。并且计算和修改地址计数器的值。在对这一条执行指令分析过程中,把分析的结果信息同时也存入代码表中。

(3).向前引用问题

    在汇编语句的操作数中可能出现变量或标号及其表达式,如果这个变量或标号已经在这条语句之前定义了,则称为向后引用。如果没有定义,则称为向前引用。一般情况下汇编程序在处理向前引用问题时都比较困难,因为指令的长度和操作数有关,操作数的类型不能确定,指令长度不能确定,就不能设置地址计数器的值,汇编就不能继续进行。这种情况下,假定操作数所占字节数是一个字节。在仿真程序中,第一遍扫描时,如果发现变量或标号,能够计算其值,那么计算出变量或标号的值,设置符号表。否则,不计算其值,地址计数器值修改是一样的。在第二遍扫描时计算出变量或标号的值,同时设置符号表中相关的变量或标号的值。

三、仿真执行部分的设计

    模型计算机仿真程序,在对汇编源程序进行两次汇编后,产生了目标代码存储在OBJ文件之中,仿真程序可打开OBJ文件控制执行。仿真执行功能主要包括目标程序的连续执行、跟踪执行和单步执行。并且,能够设置断点和复位。连续执行就是从程序开始连续执行到结束或遇到断点为止。最后显示执行的结果。跟踪执行就是从程序开始连续执行到断点,用定时器控制每执行一条指令的停顿时间,然后继续执行,每一步都显示执行的结果。单步执行一次执行一条指令,每一步都显示执行的结果。 执行到断点就是在完整执行和跟踪执行时连续执行到此处停止,并且显示执行的结果。复位就是把程序恢复到未执行时的状态。

1.模型计算机硬件的模拟

我们知道程序在内存中执行,并在执行过程中对内存单元进行存取操作,而且需要使用寄存器、输入输出端口等。在仿真程序中,要用软件模拟出模型计算机的硬件环境。

模型计算机存储器的最大容量是256字节,仿真程序用数组模拟模型计算机存储器,具体地址00~FFH为I/O空间,用于输入输出端口地址,例如01H单元为基本数据输入端口,02H单元为基本数据输出端口等。地址10H~FFH为存储空间,用于存储代码或数据。                            

模型计算机的寄存器均为8位,其中,通用寄存器为AR、BR、IX和专用寄存器为SP、IR、PC、标志寄存器F。在仿真程序中分别用变量来模拟各个寄存器

2.目标程序仿真执行的过程 

在模型计算机仿真程序中,我们对不同的汇编语言指令分别用不同的程序段来实现其功能。                                  

目标程序仿真执行时,从代码表中查询到程序每一行的相应信息,如:指令目标代码、指令的操作数的类型、操作数的值等等。对不同的指令分别执行其对应的程序段,然后根据指令执行的结果设置堆栈、寄存器、内存单元等等。并且把堆栈、寄存器、内存单元和程序中定义的标识符的值都显示在仿真程序的界面之上,以便用户查看每条指令执行的结果。如果在执行指令时有中断请求,那么仿真程序会转到中断处理程序执行,执行完成后返回。如图3所示。

《模型计算机仿真程序设计与实现》

四、结束语   

     目前这个仿真程序作为《微型计算机原理与结构》这门课程的实验程序,在计算机实验室供学生学习使用。并在使用的过程中检测出程序存在的问题和功能上的不足,以便在下一个版本中改进。

 

参考文献

[1]  《微型计算机原理与结构》    张庆平著        清华大学出版社2006年

[2]  《IBM-PC汇编语言程序设计》 沈美明 温冬婵著 清华大学出版社 2004年

[3]  《编译原理与实践》  Kenneth C.Louden 著 冯博琴 冯岚 等译 机械工业出版社2000年

 


推荐阅读
  • 本文提供了一种有效的方法来解决当Android Studio因电脑意外重启而导致的所有import语句出现错误的问题。通过清除缓存和重建项目结构,可以快速恢复开发环境。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • Vue CLI 基础入门指南
    本文详细介绍了 Vue CLI 的基础使用方法,包括环境搭建、项目创建、常见配置及路由管理等内容,适合初学者快速掌握 Vue 开发环境。 ... [详细]
  • Adobe Flash Player:功能与历史回顾
    本文详细介绍了Adobe Flash Player的功能及其在互联网发展史上的重要角色,同时探讨了其停止支持的原因及后续影响。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 在Notepad++中配置Markdown语法高亮及实时预览功能
    本文详细介绍了如何在Notepad++中配置Markdown语法高亮和实时预览功能,包括必要的插件安装和设置步骤。 ... [详细]
  • 解决Win10 1709版本文件共享安全警告问题
    每当Windows 10发布新版本时,由于兼容性问题往往会出现各种故障。近期,一些用户在升级至1709版本后遇到了无法访问共享文件夹的问题,系统提示‘文件共享不安全,无法连接’。本文将提供多种解决方案,帮助您轻松解决这一难题。 ... [详细]
  • 探讨如何在映射文件中处理重复的属性字段,以避免数据操作时出现错误。 ... [详细]
  • 在测试软件或进行系统维护时,有时会遇到电脑蓝屏的情况,即便使用了沙盒环境也无法完全避免。本文将详细介绍常见的蓝屏错误代码及其解决方案,帮助用户快速定位并解决问题。 ... [详细]
  • 利用无代码平台实现高效业务应用开发
    随着市场环境的变化加速,全球企业都在探索更为敏捷的应用开发模式,以便快速响应新兴的商业机遇。然而,传统的软件开发方式不仅成本高昂,而且耗时较长,这往往导致IT与业务部门之间的合作障碍,进而影响项目的成功。本文将探讨如何通过无代码开发平台解决这些问题。 ... [详细]
  • 如何在Windows 7 64位系统中成功注册DLL文件
    本文详细介绍了在Windows 7 64位系统中注册DLL文件的具体步骤,包括使用管理员权限运行命令提示符以及正确的路径导航方法,确保注册过程顺利进行。 ... [详细]
author-avatar
李辉国0321_817
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有