热门标签 | 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年

 


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
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社区 版权所有