⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tm.h

📁 上课时老师用过的SNL编译器
💻 H
字号:
// tm.h: interface for the Ctm class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_TM_H__69874B8A_1E39_4A85_98DA_675EE5DB9701__INCLUDED_)
#define AFX_TM_H__69874B8A_1E39_4A85_98DA_675EE5DB9701__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "string.h"


/***************** 常量 *******************/

/* 为大型程序扩展,指令存储区大小,定义为1024 */
#define   IADDR_SIZE  1024 
/* 为大型程序扩展,数据存储区大小,定义为1024 */
#define   DADDR_SIZE  1024 
/* 寄存器数量,定义为8 */
#define   NO_REGS 8
/* PC寄存器,定义为7 */
#define   PC_REG  7
/* 目标代码行大小,定义为121 */
#define   LINESIZE  121
/* 字大小,定义为20 */
#define   WORDSIZE  20

/**************** 类型 *******************/

/* 指令寻址模式类型 */
typedef enum 
{
   opclRR,		/* 寄存器寻址模式类型,操作数使用寄存器r,s,t */
   opclRM,		/* 寄存器-内存寻址模式类型,操作数使用寄存器r,内存地址d+s */
   opclRA		/* 寄存器-立即数寻址模式类型,操作数使用寄存器r,立即数值d+s */
} OPCLASS;

/* 操作指令标识码类型 */
typedef enum opcode{

   /************* 寄存器寻址模式指令标识码 ***************/

   opHALT,	/* 停止指令:结束程序执行,忽略操作数 */
   
   opIN,	/* 输入指令:将外部变量读入寄存器,使用第r个寄存器,忽略s,t参数 */

   opOUT,	/* 输出指令:将寄存器的值输出,使用第r个寄存器,忽略s,t参数 */

   opADD,   /* 加法指令:寄存器r的值赋为寄存器s的值与寄存器t的值的和 */

   opSUB,   /* 减法指令:寄存器r的值赋为寄存器s的值与寄存器t的值的差 */

   opMUL,   /* 乘法指令:寄存器r的值赋为寄存器s的值与寄存器t的值的积 */

   opDIV,   /* 除法指令:寄存器r的值赋为寄存器s的值与寄存器t的值的商 */

   /* 寄存器寻址模式指令限制标志,							*
    * 操作标识码枚举值小于opRRLim的指令均为寄存器寻址模式指令	*/
   opRRLim,  

   /************** 寄存器-内存寻址模式指令标识码 ****************/

   opLD,	/* 载入指令:寄存器r的值赋为地址为d+reg(s)的内存单元的值 */

   opST,    /* 设置指令:将地址为d+reg(s)的内存单元值赋为寄存器r的值 */

   /* 寄存器-内存寻址模式指令限制标志										*
    * 操作标识码枚举值小于opRMLim且大于opRRLim的均为寄存器-内存寻址模式指令 */
   opRMLim, 

  
   /************* 寄存器-立即数寻址模式指令标识码 ****************/

   opLDA,	/* 载入指令:将寄存器r的值赋为立即数d与寄存器s的值的和 */

   opLDC,   /* 载入指令:将寄存器r的值赋为立即数d,参数s被忽略 */

   opJLT,   /* 如果寄存器r的值小于0,将第7个寄存器的值赋为d+reg(s)	*
			 * 第7个寄存器为pc程序计数寄存器						*/

   opJLE,   /* 如果寄存器r的值小于等于0,将pc寄存器的值赋为d+reg(s) */

   opJGT,   /* 如果寄存器r的值大于0,将pc寄存器的值赋为d+reg(s) */

   opJGE,   /* 如果寄存器r的值大于等于0,将pc寄存器的值赋为d+reg(s) */

   opJEQ,   /* 如果寄存器r的值等于0,将pc寄存器的值赋为d+reg(s) */

   opJNE,   /* 如果寄存器r的值不等于0,将pc寄存器的值赋为d+reg(s) */

   /* 寄存器-立即数寻址模式指令限制标志
    * 操作标识码枚举值小于opRALim且大于opRMLim的均为寄存器-立即数寻址模式指令 */
   opRALim    

   } OPCODE;						

/************ 指令单步执行结果类型 ************/
typedef enum {
   srOKAY,			/* 正常 */

   srHALT,			/* 停止 */

   srIMEM_ERR,		/* 指令存储错 */

   srDMEM_ERR,		/* 数据存储错 */

   srZERODIVIDE		/* 除数为零错 */

   } STEPRESULT;

/* 指令结构类型:操作码,操作数1,操作数2,操作数3 */
typedef struct {
      int iop  ;
      int iarg1  ;
      int iarg2  ;
      int iarg3  ;
   } INSTRUCTION;



/* 指令操作码表,对应寻址模式分为三类 */
static  const char * opCodeTab[20]

        = {"HALT","IN","OUT","ADD","SUB","MUL","DIV","????",
          /* 寄存器寻址模式指令类型 */

           "LD","ST","????", 
		  /* 寄存器-内存寻址模式指令类型 */

           "LDA","LDC","JLT","JLE","JGT","JGE","JEQ","JNE","????"
          /* 寄存器-立即数寻址模式指令类型 */
          };

/** 单步执行结果状态表 **/
static const char * stepResultTab[5]

        = {"OK","Halted","Instruction Memory Fault",
           "Data Memory Fault","Division by 0"
          };



class Ctm
{
public:
	Ctm();
	virtual ~Ctm();



/******** 变量 ********/

FILE *listing;

int iloc ;			/* 指令存储计数指针,初始为0 */

int dloc ;			/* 数据存储计数指针,初始为0 */

int traceflag ;	/* 指令执行追踪标志,初始为FALSE */

int icountflag ;	/* 指令执行计数标志,初始为FALSE */

/* iMem用于指令存储,为1024长的指令结构数组 */
INSTRUCTION iMem [IADDR_SIZE];				

/* dMem用于数据存储,为1024长的整数类型数组 */
int dMem [DADDR_SIZE];						

/* reg用于寄存器存储,为8长的整数类型数组 */
int reg [NO_REGS];							


char pgmName[20];			/* 用于存储程序文件名 */

FILE *pgm  ;				/* 程序文件指针 */

char in_Line[LINESIZE] ;	/* 用于存储一行代码,为121长的字符数组 */

int lineLen ;				/* in_Line中行结尾字符位置 */

int inCol  ;				/* 用于指出在in_Line中的当前字符位置 */

int num  ;					/* 用于存储当前所得数值 */

char word[WORDSIZE] ;		/* 用于存储当前的字,为20长的字符数组 */

char ch  ;					/* 当前代码行中当前位置上的字符 */

int done  ;

/***************解释程序的函数声明**************/

void   tmain(char * codefile );

int opClass( int c );

void writeInstruction ( int loc );

void getCh ();

int nonBlank ();

int getNum ();

int getWord ();

int skipCh ( char c  );

int atEOL();

int error( char * msg, int lineNo, int instNo);

int readInstructions ();

STEPRESULT stepTM ();

int doCommand ();


	CString str1,str2;

};

#endif // !defined(AFX_TM_H__69874B8A_1E39_4A85_98DA_675EE5DB9701__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -