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