文档库

最新最全的文档下载
当前位置:文档库 > 详细设计说明书1doc

详细设计说明书1doc

文档名称:详细设计说明书

最后修改日期:2001.12.20

CASL汇编开发及运行环境

详细设计说明书

项目设计/实现:XX

本软件以及相关文档按照GB8657-88设计,作为同济大学电子与信息工程学院信息与控制工程系学生XX《软件技术基础课程》课程设计作品。

1.引言

1.1编写目的

在前阶段完成了对软件的定义,完成了软件需求分析、概要设计的基础上对本软件各模块进行了详细设计。此详细设计说明书对软件的总体设计和各模块的功能、性能、输入输出、算法、接口、程序逻辑、存储分配给出了详细的设计方案,作为软件各个组成部分开发的依据。

1.2参考资料

1)《Casl汇编语言文本》

2)《软件需求说明书》XX

3)《概要设计说明书》XX

4)《软件工程导论》张海藩著清华大学出版社2.总体设计

2.1需求概述

功能上,需要实现一下功能:

1)编辑用户的Casl汇编程序,并做保存。支持流行的复制/粘贴功能。

2)运行用户的Casl汇编程序,给出程序的运行情况与结果。

3)单步跟踪用户的Casl汇编程序,每条指令结束后中断程序的继续并给出结果。

4)断点设置并跟踪用户的Casl汇编程序,每条被设置了断点的指令执行后中断程序

的继续并给出结果。

2.2软件结构

软件结构描述:

软件主要模块为第一次扫描模块用以清除注释、建立符号表、指令表,第二次扫描模块根据指令表、标号表内容分析指令组成,通过调用系统模拟模块成员函数改变系统状态。达到模拟运行的功能。其他功能均建立在上述基本功能基础上。

软件分层数据流图如下:

详细设计说明书1doc

3.程序描述

3.1第一次扫描模块

功能:识别并去除用户汇编程序中的注释。识别出各个标号,构成标号表。识别出各条指令,构成指令表。

输入项目:用户汇编程序文件。

输出项目:标号表,指令表。

使用的主要算法的类C伪码描述:

1)注释以及多余的空格空行的去除:

while(文件未处理完)

{

if(当前字符为空白)

略过所有空白字符

continue;

if(当前字符字符为注释开始符号)

略过以下字符直到本行结束;

设置已换行标志;

continue

if(换行标志存在&& 当前为空白符)

略过非字母数字符号;

取消换行标志;

continue;

if(没有换行标志&& 当前字符为换行字符)

设置换行标志;

当前字符前移;

continue;

while(文件未处理完)/

{

复制当前字符到缓冲区;

if(当前字符为换行符)

{

设置换行标志;

当前字符前移;

break;

}

当前字符前移;

}

}

2)伪指令识别与处理:

unsigned short int asmfile::IsDC(char *argu,unsigned short int pc) //返回分配的内存长度

{ //argu为参数,但是可能代表多个常量,比如可以是100,200,300 if(参数内容为空) //递归出口

return 0;

取出参数中一个具体值;

取得参数剩余部分

if(参数是一个已经定义过的标号)

{

将标号在标号表中的对应值写到内存中

return 1+IsDC();

}

if(所要定义的是一个字符串)

{ 将字符串连续的写到内存中;

return iCount + IsDC();

}

识别出所要定义常数的进制;

写到内存中

return 1 + IsDC();

}

模块程序逻辑:

盒图(N_S图)描述的程序逻辑

详细设计说明书1doc

主要模块成员:

int intable(char *lab);

参数与功能:标号lab是否在标号表中

void AddInstElem(char *line,unsigned short int address);

参数与功能:将指令line加入指令表,其地址pc

void AddLabElem(char *name,unsigned short int address);

参数与功能:将标号name加入标号表,其地址address

int Init()

参数与功能:取出各条指令和标号加入表中

unsigned short int IsDC(char *argu,unsigned short int pc);

参数与功能:处理DC伪指令,DC参数argu,起始内存地址可用内存地址pc

unsigned short int IsDS(char *argu);

参数与功能:处理DS指令,DS参数argu

char *GetLine()

参数与功能:从程序文件(已经去除注释)中取出一行分析;

void SetFlag(unsigned short int pc);

参数与功能:对指令表中地址为pc的指令设置断点

int IsFlaged(unsigned short int pc);

参数与功能:判断指令为pc的指令是否被设置了断点

存储分配:本模块所需要存储较小,为100KB以内,可以使用静态分配。表格采用动态分配的存储,注意防止内存泄漏。

测试要点:程序文件非法时是否可以处理,标号相同是否可以处理

3.2第二次扫描模块

功能:从第一次扫描模块构造的指令表中反复选取指令,分析其各个部分组成。

输入项目:指令表、参数表

输出项目:分析结果结构(struct ANSWER)

算法类C伪码描述:

int GetInstElem()

{

初始化各个存储单元;

得到第一个元素,送标号存储区

if(指令已经分析结束) //只有单独的命令,没有参数

{

将标号存储区单元内容送助记符存储单元;

设置各个存储区状态

return;

}

得到一个元素,送助记符存储区

if(指令已经分析结束&& 助记符合法) //指令只含有命令和标示

{

设置各个存储区状态;

return;

}

if(遇到逗号) //说明该行没有标号,标号数组送指令数组,指令数组送ARGU1

{

助记符单元内容复制到第一参数单元;

标号单元内容复制到第二参数单元;

设置各个存储单元状态;

取第二个参数;

}

else if(指令分析结束)

{

助记符单元内容复制到第一参数单元;

标号单元内容复制到第二参数单元;

设置各个存储单元状态;

}

else //标号和指令都已经读入对应数组,开始处理各个参数,取参数递归到指令处理完{ 取参数

}

}

主要模块成员:

void GetFlag()

参数与功能:取得指令中的标号,存储在标号存储区。

void GetCommand()

参数与功能:取得直令中的助记符,存储在助记符存储区。

void GetArgu(int n)

参数与功能:取得第n个参数,递归到指令分析结束为止。

char *GetFile(char *Infile)

参数与功能:输入Infile指令到指定缓冲区

void GetInst();

参数与功能:分析一条指令,得到其标号、助记符、参数,存储在对应区域并设置状态标志int analyse(CPU &cpu,asmfile &first);

参数与功能:判断各个参数是否合法

测试要点:是否能正确取得各个参数并识别参数的合法

存储分配:静态存储

3.3系统模拟模块

功能:根据第二次扫描模块得到的助记符代码和参数,调用本模块对应的指令模拟函数,达到模拟运行的目的。

性能:要求高效,各个指令模拟函数可能的情况下都应该使用内联函数。

输入项目:分析结果结构体。

输出项目:对模拟系统状态的改变。

程序逻辑:

本模块相对简单,主要由多个指令模拟函数组成。具体需要模拟的指令见《Casl汇编语言文本》,其中决大多数指令的实现可以通过一条C/C++语句完成。考虑到效率,应该使用内联函数(inline)函数实现各条函数。

测试要点:

3.4功能模块

功能:在各个模块的支持下具体实现程序编辑、运行、调试的功能

输入项目:事件触发消息

输出项目:功能响应

程序逻辑:

模块逻辑由开发系统完成,不需要人工干预。

算法类C伪码描述:

1)程序解释执行的整个过程:

void RunRun()

{

初始化第一次扫描模块;

由第一次扫描模块处理输入程序文件,得到指令表、标号表;

初始化第二次扫描模块;

while(程序未结束&& 无错)

{ if(当前pc无效)

break;

从指令表中读取一条指令;

通过第二次扫描模块分析当前的指令;

分析指令做合法判断;

系统模拟模块模拟执行该指令;

执行指令数++;

if(执行指令数> 上限)

询问用户是否继续;

}

if(正常退出)

{

显示结果;

}

}

2)单步、断点跟踪功能:

void RunFlag()

{

初始化第一次扫描模块;

由第一次扫描模块处理输入程序文件,得到指令表、标号表;

初始化第二次扫描模块;

初始化断点设置模块等待用户输入;

while(程序未结束&& 无错)

{ if(当前pc无效)

break;

从指令表中读取一条指令;

通过第二次扫描模块分析当前的指令;

分析指令做合法判断;

系统模拟模块模拟执行该指令;

执行指令数++;

if(执行指令数> 上限)

询问用户是否继续;

if(该指令被设置断点) //单步时候此处判定始终为真

显示结果

}

if(正常退出)

{

显示结果;

}

}

模块主要成员:

virtual BOOL OnNewDocument();

参数与功能:新建一个文档

virtual void Serialize(CArchive& ar);

参数与功能:串行化,读取或者保存一个文档。

void RunRun();

参数与功能:运行一个程序

void RunTrace();

参数与功能:单步跟踪一个程序

void RunFlag();

参数与功能:断点跟踪一个程序

测试要点:编辑功能是否实现、程序运行是否逐条指令运行、程序是否在指定处被中断。

3.5断点设置模块

功能:显示指令表中各个指令,更具用户选择将指定指令加断点标志输入项目:指令表,用户选择

输出项目:指令标中的断点标志

程序逻辑:

用户点选一条指令,则其断点状态在设置与未设置之间变化一次。测试要点:断点是否被正确的写入指令表。