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 + -
显示快捷键?