📄 tm.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 + -