genasm.h

来自「用C++编写的一个编译器」· C头文件 代码 · 共 200 行

H
200
字号
#ifndef GENASM_H
#define GENASM_H
#include "syntax.h"
#include "utility.h"
/*
*      addressing mode structure       
*/
#define EAX 0
#define ECX	1
#define EDX	2
#define EBX 3
#define ESI 4
#define EDI 5 
#define	ESP 6
#define EBP 7
#define AL 0
#define CL 1
#define DL 2
#define BL 3
#define AH 4
#define CH 5
#define DH 6
#define BH 7
#define AX 0
#define CX 1
#define DX 2
#define BX 3
#define SI 4
#define DI 5 
#define	SP 6
#define BP 7

#define F_DREG	1
#define F_MEM	2
#define	F_ALT	3
#define F_IMME	4
//#define F_RELA	8
#define F_FREG	16
#define F_ALL	31
//#define F_INDX	32
#define F_NOVALUE	64
#define F_ADDR		128

enum en_addrmode {
    am_label, am_imme, am_dreg, am_freg, //am_stack,
	am_direct, am_relative, am_scale };
typedef struct _addrmode {
	enum en_addrmode mode;
	char        base_reg;
	char        index_reg;
	char		scale;	//1 means base plus index
				//no supprt to scaled
	char 		size;//byte, word, dword
	char*		entry;	//function name or global variable pointer operand
	long		offset; //address offset or immediate data operand include label no
}AddrMode;

#define isInMem(mode) ((mode)==am_direct||(mode)==am_relative||(mode) == am_scale)
/*
*
*/
enum en_opcode{
	op_mov, op_movsx, op_movzx, op_push, op_pop, op_lea, op_xchg,
	op_add, op_sub, op_inc, op_dec, op_neg,	op_cmp,
	op_jmp, op_jz, op_jnz, 
	op_jg, op_jge, op_jl, op_jle,
	op_ja, op_jae, op_jb, op_jbe,
	op_imul, op_idiv, op_mul, op_div, op_cdg,
	op_and, op_or, op_xor, op_not, op_test,
	op_sal, op_shl, op_sar, op_shr, op_call, op_label,
	op_cld, op_rep, op_movsb};

typedef struct _outcode{
	enum en_opcode	opcode;
	AddrMode		*opd1, *opd2;
}OutCode;
/*****************************************************/
//peep.c
extern OutCode *current_code ;

extern long newlabelno; 
extern long breaklabel;
extern long continuelabel;
extern long returnlabel;

void flush_queue();
void gen_code(int opc, int size, AddrMode *opd1, AddrMode *opd2);
void gen_code2(int opc, int size1, AddrMode *opd1, int size2, AddrMode *opd2);
void push_reg(int regno);
void pop_reg(int regno);

void gen_label(long labelno);
AddrMode *newAddrMode_cpy(AddrMode *am);
AddrMode *newLabel(int labelno);
AddrMode *newImme(char *addr, int data);
AddrMode *newDreg(int regno);
//AddrMode *newFregAddrMode(int regno);
AddrMode *newDirect(char *entry, long offset);
AddrMode *newRelative(int base_reg, long offset);
AddrMode *newScale(int base_reg, int index_reg, long offset);

/**********************************************************/
//genstmt.c
void gen_funcbody(struct _stmtnode *stmt);

void gen_stmt(
	struct _stmtnode *stmt //auto tackle the next stmt
);
void gen_switch(struct _stmtnode *stmt);
void gen_for(struct _stmtnode *stmt);
void gen_while(struct _stmtnode *stmt);
void gen_do(struct _stmtnode *stmt);
void gen_if(struct _stmtnode *stmt);
void gen_return(struct _stmtnode *stmt);


/************************************************************/
//genexp.c

AddrMode * gen_exp(
	struct _expnode *exp, // same as stmt,
	int flag,
	int size
);
void block_move(AddrMode *dst, AddrMode *src, int size);
AddrMode *gen_call(
	struct _expnode *func,
	struct _expnode *arglist);

AddrMode *gen_assign(
	struct _expnode *opd1,
	struct _expnode *opd2);
AddrMode *domul(int op, 
	AddrMode *ap1, 
	AddrMode *ap2);
AddrMode *gen_unary(int op, 
	struct _expnode *opd);
AddrMode *gen_indecr(int kind, 
	struct _expnode *opd);//op <0 means left
AddrMode *gen_binary(int op,
	struct _expnode *opd1,
	struct _expnode *opd2);
AddrMode *gen_mul(int kind,	
	struct _expnode *opd1, 
	struct _expnode *opd2, int mod);
AddrMode *gen_shift(int op,
	struct _expnode *opd1,
	struct _expnode *opd2);
AddrMode *gen_ptr(struct _expnode *exp);
AddrMode *gen_val(struct _expnode *exp);
AddrMode *make_legal(AddrMode *res,	int flag, int size, int unsign);
AddrMode *gen_index(struct _expnode *exp);
AddrMode *gen_trinary(struct _expnode *exp);

void falsejp(struct _expnode *exp, int labelno);
void truejp(struct _expnode *exp, int labelno);
void gen_compare(int op, struct _expnode *opd1, 
	struct _expnode *opd2, int labelno); //if true jump to the label

/**********************        outasm.c       **********************/


/*
 Output	the header content of the asm file 
*/
void asm_header(void);

/*
The main routine of generate asm code
*/
void asm_code(OutCode *code);

void asm_func_begin(
	char *func_name,
	long localdata);

void asm_func_end(char *func_name);

void put_outcode(struct _outcode *oc);

/*
Output the global variables and const string,
including data segment and bss segment
*/
void asm_globaldata(void);
/*
* Output the fixup tables and the global/external list
*/
void asm_externdecl(void);
/****************************************************/
//regmgmt.c
void initstack(void);
void mark(void);
void release(void);
AddrMode *temp_data(void);
void freeregs(AddrMode *ap);
void reserve();
extern int regs[8];
#endif

⌨️ 快捷键说明

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