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

📄 hmdlg.h

📁 本软件实现了汇编语言级虚拟机的模拟
💻 H
字号:
// HMDlg.h : header file
//

#if !defined(AFX_HMDLG_H__FE7F6E6F_1BFF_4A13_8DEC_B1AA8DB82B1E__INCLUDED_)
#define AFX_HMDLG_H__FE7F6E6F_1BFF_4A13_8DEC_B1AA8DB82B1E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CHMDlg dialog
#include "misc.h" 
#include "INS.h"
#include "EDIT.h"
// 虚拟机机器指令表  
enum MC_opcodes { 
 MC_nop, MC_clra, MC_clrc, MC_clrx, MC_cmc, MC_inc, MC_dec, MC_incx, MC_decx, 
 MC_tax, MC_ini, MC_inh, MC_inb, MC_ina, MC_oti, MC_otc, MC_oth, MC_otb, 
 MC_ota, MC_push, MC_pop, MC_shl, MC_shr, MC_ret, MC_halt, MC_lda, MC_ldx, 
 MC_ldi, MC_lsp, MC_lspi, MC_sta, MC_stx, MC_add, MC_adx, MC_adi, MC_adc, 
 MC_acx, MC_aci, MC_sub, MC_sbx, MC_sbi, MC_sbc, MC_scx, MC_sci, MC_cmp, 
 MC_cpx, MC_cpi, MC_ana, MC_anx, MC_ani, MC_ora, MC_orx, MC_ori, MC_jmp, 
 MC_bze, MC_bnz, MC_bpz, MC_bng, MC_bcc, MC_bcs, MC_tsp, MC_jsr, MC_lbpi, 
 MC_fbpi, MC_tbp, MC_tsb, MC_tabp, MC_bad = 255 
}; 

//虚拟机的运行状态枚举定义 
typedef enum { running, finished, nodata, baddata, badop } status; 
typedef unsigned char MC_bytes; 
typedef struct refnodes { 
 MC_bytes refsymaddr; //引用地址标号产生的内存地址 
 struct refnodes *nextref; //指向向后引用地址标号的下一结点的链表指针 
} refnode; 

typedef struct symtab { 
 char symname[MAXSYMLEN]; //符号地址定义名 
 MC_bytes symaddr; //符号地址定义名所代表的内存地址 
 struct refnodes *firstref; //引用该符号地址的首次出现,用以实现链表 
} symboltab; 

//由lex词法分析器给调用者返回的记号种类的枚举类型定义 
//ASMCODE:汇编指令;LABEL:定义地址标号;REFLABEL:引用地址标号;NUM:数字标识; 
//ID:标识符;       CMNT:注释语名标识; UNKNOWN:不可识别的标号 
typedef enum tktype {  
 ASMCODE, LABEL, REFLABEL,  
 NUMBER, ID, NUM, CMNT,UNKNOWN 
} tokentype; 


class CHMDlg : public CDialog
{
// Construction
public: 
 //  汇编器的构造函数 打开源文件,初始化符号表 
void AS(char *sourcename, bool &opening); 
 // 析构函数关闭源文件 
 void AAS(); 
 // 将源文件的汇编语言程序汇编成机器指令并将其存入CPU的内存中,若在汇编中存在错误,则将 
 // 错误标志返回到errors中 
 bool assemble(bool & errors) ;

 //mksymtab:第1遍扫描时构造符号表     
 void mksymtab(int &err); 

 /* 
       lex:汇编器所要调用的词法分析函数,给主调函数返回当前所读得的词法记号的类型并将单词符号串 
       存入words数组中,同时查机器的指令表,将该单词对应的机器指令存入opcode返回主调函数。  
     */ 
 tokentype lex(char *words, MC_opcodes & opcode); 


 //lookupcmd: 查询汇编指令表,返回cmd所对应的机器指令 
 MC_bytes lookupcmd(char *cmd); 

 /*     
   seeklabel 
   查询符号表,确定符号的存在收 
   purpose=0 是否对于符号进行了重复定义,进行错误提示 
   purpose=1 是否已经有该符号,以便进行引用填充     
     */ 
 int seeklabel(char *lbl, int purpose); 

 //symtablen(): 取得符号表的长度 
 int symtablen(); 
 int binlen; //binary code length 
CHMDlg(CWnd* pParent = NULL);	// standard constructor
 MC_bytes mem[256]; // 虚拟机的内存空间 

 //将mem中的数据据输出到srcname所指的文件中 
 void listcode(char *srcname = ""); 
     
 //对虚拟机执行汇编后的机器指令程序的主体函数 
 //各参数取自interpret()传递过来的值,意义与interpret()相同。 
 void execute(); 
     
 //对虚拟机执行汇编后的机器指令程序进行执行执行前的准备工作: 
 //argc:用户在命令行上提供的参数个数,据此判断是否以交互方式提示用户输入如下的参数: 
 //trace:设定跟踪标志;datafile:程序的输入数据文件, outfile:程序的输出文件 
 //entrance:机器指令程序的入口点 
 void interpret(); 

 // 取得str所对应的机器指令 
 MC_bytes opcoded(char *str);
 INS ins;
 EDIT edit;
 void readchar(char &ch, status & ps) ;   
 int getnumber(int base, status &ps) ;
// 构造函数对机器进行初始化 
void MC(); 
     
 //取得机器指令i的助记符  
 inline char *getmns(int i) { 
  return mnemonics[i]; 
 } ; 

 //取得机器指令i长度? 
 inline int getmnxlen(int i) { 
  return mnxlen[i]; 
 }  

 //虚拟机的处理器的内部结构定义 
 struct processor { 
  MC_bytes a; // 累加器A 
  MC_bytes sp; // 堆栈指针sp 
  MC_bytes x; // 变址寄存器 x  
  MC_bytes ir; // 指令寄存器 ir 
  MC_bytes ar; // 指令寄存器 ar 
  MC_bytes pc; // 程序计数器 
  MC_bytes bp; // 基址指针bp 
  bool z, p, c; // 标志寄存器 
 }; 
 processor cpu;  //虚拟机的cpu 
 status ps;      //保存cpu的运行状态 

 char *mnemonics[256];  //机器指令/助记符对照表 
 int   mnxlen[256]; //机器指令长度表 
 char shh[4];
 void runtime_error( MC_bytes pcnow); //输出运行时错误至results文件 
 void setflags(MC_bytes MC_register); //设定MC_register的状态 
 MC_bytes index(void); //计算变址地址 

	char *sh[100];
	void showrtoedit();
	void showr();
	void showmem();
	char bits[9];
 void itb(int a);
 void itx(int num,char* string1);
// Dialog Data
	//{{AFX_DATA(CHMDlg)
	enum { IDD = IDD_HM_DIALOG };
	CListCtrl	m_list;
	CString	m_ac;
	CString	m_ar;
	int		m_c;
	CString	m_doc;
	CString	m_ir;
	int		m_length;
	int		m_p;
	CString	m_pc;
	int		m_z;
	CString	m_show_edit;
	CString	m_out;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CHMDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
private: 
 FILE *src; // 源文件指针 
 char srcfile[100]; // 保存源文件名 
 symboltab symtabhdr[SYMTABLEN]; //符号表结构数组 

protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CHMDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnBegin();
	afx_msg void OnOpen();
	afx_msg void OnNext();
	afx_msg void OnCalldos();
	afx_msg void OnOpens();
	afx_msg void OnOwner();
	afx_msg void OnEdit();
	afx_msg void OnHelp();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_HMDLG_H__FE7F6E6F_1BFF_4A13_8DEC_B1AA8DB82B1E__INCLUDED_)

⌨️ 快捷键说明

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