TEC-XP16教学机上C语言运行环境的实现

来源:优秀文章 发布时间:2023-01-26 点击:

宗德才, 王康康

(1.常熟理工学院,计算机科学与工程学院, 江苏,常熟 215500;2.江苏科技大学,数理学院, 江苏,镇江 212003)

目前,国内很多高校计算机组成原理实验教学内容主要是基于TEC-XP16 教学机而开展的。为了使学生更好地掌握计算机各个组成部件的工作原理,理解计算机软件系统的层次结构,系统地建立计算机整机概念,迫切需要开发一些设计性实验,如在TEC-XP16教学机中设计一些新指令、利用TEC-XP16教学机的汇编指令设计高级语言解释程序等。文献[1]研究了在TEC-XP16教学机组合逻辑控制器中扩展简单指令的方法;文献[2]提出了TEC-XP16教学机微程序控制器中一种8 bit无符号数乘除指令的设计方法;文献[3] 提出了一种快速设计实现 32 bit 浮点除法指令的方法;文献[4]利用TEC-XP16教学机的汇编指令实现了BASIC语言解释程序,BASIC语言解释执行程序实现的语句如表1所示。为TEC-XP16教学机设计高级语言解释程序,对理解计算机软件系统的层次结构很有用,特别是机器语言、汇编语言和高级语言的功能和用法上的不同之处[4]。

表1 BASIC语言解释程序实现的语句

本文利用TEC-XP16教学机的汇编指令[5]设计实现一种C语言解释程序。

C语言解释程序主要负责处理与用户的接口,即循环处理执行即时命令和C语言语句。

即时命令包括new、run和system,如表2所示。即时命令直接输入后按下回车键就直接开始运行。

表2 即时命令

为了与即时命令相区别,C程序语句前面加行号,如果只输入一个行号后面没有语句,则此行号无效,如果原来存在以此行号为标识的语句,则删除原语句。

输入完一个C语言程序之后,通过run命令运行C语言程序。

1.1 C语言程序的输入

在C语言解释程序启动后,首先会初始化2000H~2600H地址范围内的教学机内存和stack_While等堆栈,然后等待用户输入。

当用户输入一条C语言语句并按下回车键之后,首先将输入的每一个字符的ASCII码用16位二进制形式存入教学机2675H地址开始的内存缓冲区,然后检查2675H地址开始的内存缓冲区。如果输入的行号或数字在0~9之间,则用16位二进制表示,并加上数字标志1000H;如果输入的行号或数字大于等于10,则用32位浮点数表示,并加上标志8000H;如果是保留字,则加上保留字标志2000H,如表3所示。将C语言语句的保留关键字[6]用一个4位十六进制数表示,如表4所示,WHILE用2000 H表示,=用201FH表示,IF用200BH表示,最后将所有的空格删除,并将当前的C语句复制到上一条语句之后的内存缓冲区。

表3 数据类型与标志

表4 C语言保留关键字与对应的十六进制数

每一条C语言语句用16位语句长度、16位行号,C语言语句内容的格式存储,如图1所示。

图1 C语言语句的存储格式

输入的第一条C语句最终将复制到教学机2000H地址开始的内存缓冲区,其余的C语句按照行号顺序依次复制到上一条语句之后的内存缓冲区。

1.2 C语言程序的运行

输入完一个C语言程序之后,通过run命令即可运行这个程序。

1.2.1 初始化堆栈

检查2000H地址开始的内存缓冲区。

(1) 取出第一条C语言语句。

(2) 检查语句长度是否为0,若为0则结束,不为0则转(3)。

(3) 如果语句内容部分的第一个存储单元内容是2030H(main保留字),则语句种类0004H压入堆栈Stack_ifwhl,然后转(4);

如果语句内容部分是自定义函数定义,则语句种类0003H压入堆栈Stack_ifwhl,然后转(4);

如果语句内容部分的第一个存储单元内容是if保留字、while保留字、else保留字,则分别将0000H、0001H和0002H压入堆栈stack_ifwhl,并将其所在行号压入堆栈stack_line,然后转(4);

如果语句内容部分的第一个存储单元内容是“}”,且堆栈stack_ifwhl栈顶是0003H, 则stack_ifwhl栈顶元素出栈,然后转(4);

如果语句内容部分的第一个存储单元内容是“}”,且堆栈stack_ifwhl栈顶是0004H,则取得“}”所在行号压入堆栈stack_emain,stack_ifwhl栈顶元素出栈,然后转(4);

如果语句内容部分的第一个存储单元内容是“}”,且堆栈stack_ifwhl栈顶是0000H、0001H、0002H,则取得“}”所在行号分别压入堆栈stack_eif、stack_eWhl、stack_eelse,并取得stack_line栈顶行号和“}”所在行号依次存入Rel_tbl,stack_line栈顶元素出栈,stack_ifwhl栈顶元素出栈,然后转(4)。

(4) 取出下一条C语句,然后转(2)。

程序运行时各个保留字与堆栈stack_ifwhl、stack_line等的关系如表5所示。Rel_tbl表用于存放while语句、if语句和else语句所在的行号与其对应的“}”所在的行号之间的对应关系。

表5 程序运行时保留字与堆栈的关系

1.2.2 运行C语言程序

从2000H地址开始运行代码。

(1) 取出第一条C语言语句。

(2) 检查语句长度是否为0,若为0则结束,不为0则转(3)。

(3) 如果语句内容部分的第一个存储单元内容是“{”,则直接转(4);

如果语句内容部分的第一个存储单元内容是“}” ,且“}”的行号在堆栈stack_emain中,则结束C程序的运行;

如果语句内容部分的第一个存储单元内容是“}”,且“}”的行号在堆栈stack_eWhl中,则调用call_EWHILE子程序,调用返回后转(4);

如果语句内容部分的第一个存储单元内容是“}”,且“}”的行号在堆栈stack_eelse中,则直接转(4);

如果语句内容部分的第一个存储单元内容是“}”,且“}”的行号在堆栈stack_eif中,如果if后没有else则转(4),如果if后有else则找到else语句的结束“}”的行号,转(4);

如果语句内容部分是自定义函数调用,则调用call_Func子程序,调用返回后转(4);

如果语句内容部分的第一个存储单元内容是C语言保留关键字,则执行过程调用,如r0中是2000h,则执行call_WHILE子程序;如r0中是200Bh,则执行call_if子程序;如r0中是200Dh,则执行call_Return子程序,调用返回后转(4)。

(4) 取出下一条C语句,然后转(2)。

call_While子程序的执行过程如下:

(1) 取得当前while语句所在的行号送r7寄存器;

(2) 计算while语句的条件表达式是否成立,若条件成立,则从堆栈stack_While栈顶取出行号送r1寄存器如果r7寄存器的值等于r1寄存器的值,则r14寄存器指向下一个语句行的长度位置;如果r7寄存器的值不等于r1寄存器的值,则将r7寄存器的值压入堆栈stack_While并且r14指向下一个语句行的长度位置;

(3) 如果while语句的条件表达式不成立,则堆栈stack_While栈顶元素出栈,在Rel_tbl表中查找与当前while语句对应的“}”语句所在的行号,r14指向找到的“}”语句的下一个语句行的长度位置。

call_EWHILE子程序的执行过程如下:

从堆栈stack_While栈顶取出行号送r1寄存器,从2000H地址开始查找行号等于r1寄存器值的语句行,r14指向该语句行的语句长度位置,如果没有找到则报错。

call_If子程序的执行过程如下:

(1) 取得当前if语句所在的行号送r7寄存器;

(2) 计算if语句的条件表达式是否成立,如果条件成立,则r14指向下一个语句行的长度位置;

(3) 如果if语句的条件表达式不成立,则在Rel_tbl表中查找与当前if语句对应的“}”语句所在的行号,然后判断“}”语句后面有没有else,如有else则执行else语句,若没有else则r14指向找到的“}”语句的下一个语句行的语句长度位置。

call_Func传值调用时形式参数与调用函数实参的关系:

(1) 将调用函数的实参值从右往左先后压入堆栈stack_funcPr;

(2) 将被调用函数形式参数名与调用函数实参值所在的内存地址对应关系存放到Func_Ptbl表;

(3) 令SubFun_flag=1;

(4) call_Func函数执行过程中,在Func_Ptbl表中查找与被调用函数中形参名对应的调用函数实参值地址。

call_FUNC传地址调用时形式参数与调用函数实参的关系:

(1) 将调用函数的实参地址从右往左先后压入堆栈Stack_funcPr;

(2) 将被调用函数形式参数名与调用函数实参地址所在的内存地址之间的对应关系存放到Func_Ptbl表;

(3) 令SubFun_flag=1;

(4) 在call_func函数执行过程中,在Func_Ptbl表中查找与被调用函数中形式参数名对应的调用函数实参地址所在的内存地址。

call_Return子程序执行后,令SubFun_flag=0,返回到函数调用语句的下一条语句处。

首先,将保存在main.asm文件中的C语言解释程序用教学机汇编程序teca.exe汇编成MAIN.COD二进制文件。接着,启动TEC-XP16教学机模拟软件,然后启动教学机监控程序,如图2所示。

图2 启动监控程序成功

图2中选择“发送文件”按钮,把C语言解释程序调入模拟系统,使系统进入C语言程序的运行环境。

在监控程序中输入g0a30启动C语言程序的运行环境,如图3所示。

图3 启动C语言程序的运行环境

为了验证C语言解释程序的正确性,设计了while循环语句的嵌套、while-if语句的嵌套、传值函数调用和传地址函数调用4个C语言程序,如图4~图7所示,仿真结果表明所设计的C语言解释程序是正确的。

图4 while循环语句嵌套

图5 while-if语句嵌套

利用TEC-XP16教学机的汇编指令设计C语言解释程序可以作为计算机组成原理实验内容和课程设计内容,对学生理解掌握教学机的汇编指令很有帮助。为TEC-XP16教学机设计C语言运行环境能够使学生更加深刻地理解机器语言、汇编语言和高级语言之间的联系与区别。

之后将进一步完善C语言运行环境,使其能支持for语句、do-while语句、break语句、continue语句、switch语句等,并使其能够保存输入的C程序以及打开已有的C程序文件。

图6 传值函数调用

图7 传地址函数调用

猜你喜欢 堆栈C语言语句 基于Visual Studio Code的C语言程序设计实践教学探索计算机教育(2020年5期)2020-07-2451单片机C语言入门方法电子制作(2019年14期)2019-08-20基于C语言的计算机软件编程电子制作(2018年16期)2018-09-26应用EDAC容错技术的星载软件堆栈溢出实时检测方法航天器工程(2018年4期)2018-09-15缓冲区溢出安全编程教与学电脑知识与技术(2017年14期)2017-07-10一种航天器软件进程堆栈使用深度的动态检测方法航天器工程(2017年1期)2017-04-19高职高专院校C语言程序设计教学改革探索山东工业技术(2016年15期)2016-12-01我喜欢小学生·多元智能大王(2014年6期)2014-07-09冠词缺失与中介语句法损伤研究外语教学理论与实践(2014年1期)2014-06-15作文语句实录小雪花·初中高分作文(2009年8期)2009-11-16推荐访问:运行环境 机上 语言
上一篇:《忠实的朋友》中形式对意义的消解
下一篇:光学课程翻转课堂思政元素的融入*

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有