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

📄 outas68.c

📁 一个c compiler的source code
💻 C
📖 第 1 页 / 共 3 页
字号:
/*                         
 * 68K/386 32-bit C compiler.
 *
 * copyright (c) 1997, David Lindauer
 * 
 * This compiler is intended for educational use.  It may not be used
 * for profit without the express written consent of the author.
 *
 * It may be freely redistributed, as long as this notice remains intact
 * and either the original sources or derived sources 
 * are distributed along with any executables derived from the originals.
 *
 * The author is not responsible for any damages that may arise from use
 * of this software, either idirect or consequential.
 *
 * v1.35 March 1997
 * David Lindauer, gclind01@starbase.spd.louisville.edu
 *
 * Credits to Mathew Brandt for original K&R C compiler
 *
 */
#include        <stdio.h>
#include				<ctype.h>
#include        "expr.h"
#include        "c.h"
#include        "gen68.h"
#include 				"diag.h"

/*      variable initialization         */
extern int global_flag;
extern SYM *currentfunc;
extern HASHREC **globalhash;
extern OCODE *peep_insert, *peep_head, *peep_tail;
extern int prm_rel;
extern long nextlabel;
extern FILE *outputFile;
extern int	prm_asmfile;
extern int prm_lines;
extern int phiused;
extern int prm_cmangle;

enum e_gt  gentype = nogen;		/* Current DC type */
enum e_sg	 curseg = noseg;		/* Current seg */
int        outcol = 0;				/* Curront col (roughly) */
int 			 dataofs;						/* Offset from last label */
SYM *datasp;									/* Symbol of last named label */
static DATALINK *datahead, *datatail;	/* links for fixup gen */
static int phiput;

ASMREG reglst[] = {
	{ 0 , 0 , 0 },
};
/* List of opcodes
 * This list MUST be in the same order as the op_ enums 
 */
ASMNAME oplst[] = {
	{ "?reserved",op_reserved,0 },
	{ "?line#",op_reserved,0 },
	{ "?seq@",op_reserved,0 },
	{ "?slit",op_reserved,0 },
	{ "?label",op_reserved,0 },
	{ "?flabel",op_reserved,0 },
	{ "dc",op_reserved,0 },
	{ "dc",op_reserved,0 },
	{ "dc",op_reserved,0 },
	{ "abcd",op_abcd,0 },
	{ "add",op_add,0 },
	{ "adda",op_adda,0 },
	{ "addi",op_addi,0 },
	{ "addq",op_addq,0 },
	{ "addx",op_addx,0 },
	{ "and",op_and,0 },
	{ "andi",op_andi,0 },
	{ "asl",op_asl,0 },
	{ "asr",op_asr,0 },
	{ "bra",op_bra,0 },
	{ "beq",op_beq,0 },
	{ "bne",op_bne,0 },
	{ "blt",op_blt,0 },
	{ "ble",op_ble,0 },
	{ "bgt",op_bgt,0 },
	{ "bge",op_bge,0 },
	{ "bhi",op_bhi,0 },
	{ "bhs",op_bhs,0 },
	{ "blo",op_blo,0 },
	{ "bls",op_bls,0 },
	{ "bsr",op_bsr,0 },
	{ "bcc", op_bcc,0 },
	{ "bcs", op_bcs,0 },
	{ "bmi", op_bmi,0 },
	{ "bpl", op_bpl,0 },
	{ "bvc", op_bvc,0 },
	{ "bvs", op_bvs,0 },
	{ "bchg",op_bchg,0 },
	{ "bclr",op_bclr,0 },
	{ "bfchg",op_bfchg,0 },
	{ "bfclr",op_bfclr,0 },
	{ "bfexts",op_bfexts,0 },
	{ "bfextu",op_bfextu,0 },
	{ "bfffo",op_bfffo,0 },
	{ "bfins",op_bfins,0 },
	{ "bfset",op_bfset,0 },
	{ "bftst",op_bftst,0 },
	{ "bkpt", op_bkpt,0 },
	{ "bset",op_bset,0 },
	{ "btst",op_btst,0 },
	{ "chk",op_chk,0 },
	{ "chk2",op_chk2,0 },
	{ "clr",op_clr,0 },
	{ "cmp",op_cmp,0 },
	{ "cmpa",op_cmpa,0 },
	{ "cmpi",op_cmpi,0 },
	{ "cmpm",op_cmpm,0 },
	{ "cmp2",op_cmp2,0 },
	{ "dbeq",op_dbeq,0 },
	{ "dbne",op_dbne,0 },
	{ "dblt",op_dblt,0 },
	{ "dble",op_dble,0 },
	{ "dbgt",op_dbgt,0 },
	{ "dbge",op_dbge,0 },
	{ "dbhi",op_dbhi,0 },
	{ "dbhs",op_dbhs,0 },
	{ "dblo",op_dblo,0 },
	{ "dbls",op_dbls,0 },
	{ "dbsr",op_dbsr,0 },
	{ "dbcc", op_dbcc,0 },
	{ "dbcs", op_dbcs,0 },
	{ "dbmi", op_dbmi,0 },
	{ "dbpl", op_dbpl,0 },
	{ "dbvc", op_dbvc,0 },
	{ "dbvs", op_dbvs,0 },
	{ "dbt", op_dbt,0 },
	{ "dbf", op_dbf,0 },
	{ "dbra",op_dbra,0 },
	{ "divs",op_divs,0 },
	{ "divu",op_divu,0 },
	{ "divsl",op_divsl,0 },
	{ "divul",op_divul,0 },
	{ "eor",op_eor,0 },
	{ "eori",op_eori,0 },
	{ "exg",op_exg,0 },
	{ "ext",op_ext,0 },
	{ "extb",op_extb,0 },
	{ "illegal", op_illegal, 0 },
	{ "jmp",op_jmp,0 },
	{ "jsr",op_jsr,0 },
	{ "lea",op_lea,0 },
	{ "link",op_link,0 },
	{ "lsl",op_lsl,0 },
	{ "lsr",op_lsr,0 },
	{ "move",op_move,0 },
	{ "movea",op_movea,0 },
	{ "movec",op_movec,0 },
	{ "movem",op_movem,0 },
	{ "movep",op_movep,0 },
	{ "moveq",op_moveq,0 },
	{ "moves",op_moves,0 },
	{ "muls",op_muls,0 },
	{ "mulu",op_mulu,0 },
	{ "nbcd",op_nbcd,0 },
	{ "neg",op_neg,0 },
	{ "negx",op_negx,0 },
	{ "nop",op_nop,0 },
	{ "not",op_not,0 },
	{ "or",op_or,0 },
	{ "ori",op_ori,0 },
	{ "pack",op_pack,0 },
	{ "pea",op_pea,0 },
	{ "reset",op_reset,0 },
	{ "rol",op_rol,0 },
	{ "ror",op_ror,0 },
	{ "roxl",op_roxl,0 },
	{ "roxr",op_roxr,0 },
	{ "rtd",op_rtd,0 },
	{ "rte",op_rte,0 },
	{ "rtr",op_rtr,0 },
	{ "rts",op_rts,0 },
	{ "sbcd",op_sbcd,0 },
	{ "seteq",op_seteq,0 },
	{ "setne",op_setne,0 },
	{ "setlt",op_setlt,0 },
	{ "setle",op_setle,0 },
	{ "setgt",op_setgt,0 },
	{ "setge",op_setge,0 },
	{ "sethi",op_sethi,0 },
	{ "seths",op_seths,0 },
	{ "setlo",op_setlo,0 },
	{ "setls",op_setls,0 },
	{ "setsr",op_setsr,0 },
	{ "setcc", op_setcc,0 },
	{ "setcs", op_setcs,0 },
	{ "setmi", op_setmi,0 },
	{ "setpl", op_setpl,0 },
	{ "setvc", op_setvc,0 },
	{ "setvs", op_setvs,0 },
	{ "sett", op_sett,0 },
	{ "setf", op_setf,0 },
	{ "sub",op_sub,0 },
	{ "stop",op_stop,0 },
	{ "suba",op_suba,0 },
	{ "subi",op_subi,0 },
	{ "subq",op_subq,0 },
	{ "subx",op_subx,0 },
	{ "swap",op_swap,0 },
	{ "tas",op_tas,0 },
	{ "trap",op_trap,0 },
	{ "trapeq",op_trapeq,0 },
	{ "trapne",op_trapne,0 },
	{ "traplt",op_traplt,0 },
	{ "traple",op_traple,0 },
	{ "trapgt",op_trapgt,0 },
	{ "trapge",op_trapge,0 },
	{ "traphi",op_traphi,0 },
	{ "traphs",op_traphs,0 },
	{ "traplo",op_traplo,0 },
	{ "trapls",op_trapls,0 },
	{ "trapsr",op_trapsr,0 },
	{ "trapcc", op_trapcc,0 },
	{ "trapcs", op_trapcs,0 },
	{ "trapmi", op_trapmi,0 },
	{ "trappl", op_trappl,0 },
	{ "trapvc", op_trapvc,0 },
	{ "trapvs", op_trapvs,0 },
	{ "trapt", op_trapt,0 },
	{ "trapf", op_trapf,0 },
	{ "trapv", op_trapv,0 },
	{ "tst",op_tst,0 },
	{ "unlk",op_unlk,0 },
	{ "unpk",op_unpk,0 },
	{ "fabs",op_fabs,0 },
	{ "facos",op_facos,0 },
	{ "fadd",op_fadd,0 },
	{ "fasin",op_fasin,0 },
	{ "fatan",op_fatan,0 },
	{ "fatanh",op_fatanh,0 },
	{ "fbeq", op_fbeq, 0 },
	{ "fbne", op_fbne, 0 },
	{ "fbgt", op_fbgt, 0 },
	{ "fbngt", op_fbngt, 0 },
	{ "fbge", op_fbge, 0 },
	{ "fbnge", op_fbnge, 0 },
	{ "fblt", op_fblt, 0 },
	{ "fbnlt", op_fbnlt, 0 },
	{ "fble", op_fble, 0 },
	{ "fbnle", op_fbnle, 0 },
	{ "fbgl", op_fbgl, 0 },
	{ "fbngl", op_fbngl, 0 },
	{ "fbgle", op_fbgle, 0 },
	{ "fbngle", op_fbngle, 0 },
	{ "fbogt", op_fbogt, 0 },
	{ "fbule", op_fbule, 0 },
	{ "fboge", op_fboge, 0 },
	{ "fbult", op_fbult, 0 },
	{ "fbolt", op_fbolt, 0 },
	{ "fbuge", op_fbuge, 0 },
	{ "fbole", op_fbole, 0 },
	{ "fbugt", op_fbugt, 0 },
	{ "fbogl", op_fbogl, 0 },
	{ "fbueq", op_fbueq, 0 },
	{ "fbor", op_fbor, 0 },
	{ "fbun", op_fbun, 0 },
	{ "fbt", op_fbt, 0 },
	{ "fbf", op_fbf, 0 },
	{ "fbst", op_fbst, 0 },
	{ "fbsf", op_fbsf, 0 },
	{ "fbseq", op_fbseq, 0 },
	{ "fbsne", op_fbsne, 0 },
	{ "fcmp",op_fcmp,0 },
	{ "fcos",op_fcos,0 },
	{ "fcosh",op_fcosh,0 },
	{ "fdbeq", op_fdbeq, 0 },
	{ "fdbne", op_fdbne, 0 },
	{ "fdbgt", op_fdbgt, 0 },
	{ "fdbngt", op_fdbngt, 0 },
	{ "fdbge", op_fdbge, 0 },
	{ "fdbnge", op_fdbnge, 0 },
	{ "fdblt", op_fdblt, 0 },
	{ "fdbnlt", op_fdbnlt, 0 },
	{ "fdble", op_fdble, 0 },
	{ "fdbnle", op_fdbnle, 0 },
	{ "fdbgl", op_fdbgl, 0 },
	{ "fdbngl", op_fdbngl, 0 },
	{ "fdbgle", op_fdbgle, 0 },
	{ "fdbngle", op_fdbngle, 0 },
	{ "fdbogt", op_fdbogt, 0 },
	{ "fdbule", op_fdbule, 0 },
	{ "fdboge", op_fdboge, 0 },
	{ "fdbult", op_fdbult, 0 },
	{ "fdbolt", op_fdbolt, 0 },
	{ "fdbuge", op_fdbuge, 0 },
	{ "fdbole", op_fdbole, 0 },
	{ "fdbugt", op_fdbugt, 0 },
	{ "fdbogl", op_fdbogl, 0 },
	{ "fdbueq", op_fdbueq, 0 },
	{ "fdbor", op_fdbor, 0 },
	{ "fdbun", op_fdbun, 0 },
	{ "fdbt", op_fdbt, 0 },
	{ "fdbf", op_fdbf, 0 },
	{ "fdbst", op_fdbst, 0 },
	{ "fdbsf", op_fdbsf, 0 },
	{ "fdbseq", op_fdbseq, 0 },
	{ "fdbsne", op_fdbsne, 0 },
	{ "fdiv",op_fdiv,0 },
	{ "fetox",op_fetox,0 },
	{ "fetoxm1",op_fetoxm1,0 },
	{ "fgetexp",op_fgetexp,0 },
	{ "fgetman",op_fgetman,0 },
	{ "fint",op_fint,0 },
	{ "fintrz",op_fintrz,0 },
	{ "flog10",op_flog10,0 },
	{ "flog2",op_flog2,0 },
	{ "flogn",op_flogn,0 },
	{ "flognp1",op_flognp1,0 },
	{ "fmod",op_fmod,0 },
	{ "fmove",op_fmove,0 },
	{ "fmovecr",op_fmovecr,0 },
	{ "fmovem",op_fmovem,0 },
	{ "fmul",op_fmul,0 },
	{ "fneg",op_fneg,0 },
	{ "fnop",op_fnop,0 },
	{ "frem",op_frem,0 },
	{ "fscale",op_fscale,0 },
	{ "fseq", op_fseq, 0 },
	{ "fsne", op_fsne, 0 },
	{ "fsgt", op_fsgt, 0 },
	{ "fsngt", op_fsngt, 0 },
	{ "fsge", op_fsge, 0 },
	{ "fsnge", op_fsnge, 0 },
	{ "fslt", op_fslt, 0 },
	{ "fsnlt", op_fsnlt, 0 },
	{ "fsle", op_fsle, 0 },
	{ "fsnle", op_fsnle, 0 },
	{ "fsgl", op_fsgl, 0 },
	{ "fsngl", op_fsngl, 0 },
	{ "fsgle", op_fsgle, 0 },
	{ "fsngle", op_fsngle, 0 },
	{ "fsogt", op_fsogt, 0 },
	{ "fsule", op_fsule, 0 },
	{ "fsoge", op_fsoge, 0 },
	{ "fsult", op_fsult, 0 },
	{ "fsolt", op_fsolt, 0 },
	{ "fsuge", op_fsuge, 0 },
	{ "fsole", op_fsole, 0 },
	{ "fsugt", op_fsugt, 0 },
	{ "fsogl", op_fsogl, 0 },
	{ "fsueq", op_fsueq, 0 },
	{ "fsor", op_fsor, 0 },
	{ "fsun", op_fsun, 0 },
	{ "fst", op_fst, 0 },
	{ "fsf", op_fsf, 0 },
	{ "fsst", op_fsst, 0 },
	{ "fssf", op_fssf, 0 },
	{ "fsseq", op_fsseq, 0 },
	{ "fssne", op_fssne, 0 },
	{ "fsgldiv",op_fsgldiv,0 },
	{ "fsglmul",op_fsglmul,0 },
	{ "fsin",op_fsin,0 },
	{ "fsincos",op_fsincos,0 },
	{ "fsinh",op_fsinh,0 },
	{ "fsqrt",op_fsqrt,0 },
	{ "fsub",op_fsub,0 },
	{ "ftan",op_ftan,0 },
	{ "ftanh",op_ftanh,0 },
	{ "ftentox",op_ftentox,0 },
	{ "ftrapeq", op_ftrapeq, 0 },
	{ "ftrapne", op_ftrapne, 0 },
	{ "ftrapgt", op_ftrapgt, 0 },
	{ "ftrapngt", op_ftrapngt, 0 },
	{ "ftrapge", op_ftrapge, 0 },
	{ "ftrapnge", op_ftrapnge, 0 },
	{ "ftraplt", op_ftraplt, 0 },
	{ "ftrapnlt", op_ftrapnlt, 0 },
	{ "ftraple", op_ftraple, 0 },
	{ "ftrapnle", op_ftrapnle, 0 },
	{ "ftrapgl", op_ftrapgl, 0 },
	{ "ftrapngl", op_ftrapngl, 0 },
	{ "ftrapgle", op_ftrapgle, 0 },
	{ "ftrapngle", op_ftrapngle, 0 },
	{ "ftrapogt", op_ftrapogt, 0 },
	{ "ftrapule", op_ftrapule, 0 },
	{ "ftrapoge", op_ftrapoge, 0 },
	{ "ftrapult", op_ftrapult, 0 },
	{ "ftrapolt", op_ftrapolt, 0 },
	{ "ftrapuge", op_ftrapuge, 0 },
	{ "ftrapole", op_ftrapole, 0 },
	{ "ftrapugt", op_ftrapugt, 0 },
	{ "ftrapogl", op_ftrapogl, 0 },
	{ "ftrapueq", op_ftrapueq, 0 },
	{ "ftrapor", op_ftrapor, 0 },
	{ "ftrapun", op_ftrapun, 0 },
	{ "ftrapt", op_ftrapt, 0 },
	{ "ftrapf", op_ftrapf, 0 },
	{ "ftrapst", op_ftrapst, 0 },
	{ "ftrapsf", op_ftrapsf, 0 },
	{ "ftrapseq", op_ftrapseq, 0 },
	{ "ftrapsne", op_ftrapsne, 0 },
	{ "ftst",op_ftst,0 },
	{ "ftwotox",op_ftwotox,0 },
	{ 0,0,0 },
 };
/* Init module */
void outcodeini(void)
{
	gentype = nogen;
	curseg = noseg;
	outcol = 0;
	datahead = datatail = 0;   
	phiput = FALSE;
}
/*
 * Register a fixup 
 */
void datalink(int flag)
{
	DATALINK *p;
	if (!prm_rel)
		return;
	global_flag++;							/* Global tab */
	p = xalloc(sizeof(DATALINK));
	p->sp = datasp;
	p->type = flag;
	p->offset = dataofs;
	p->next = 0;
	if (datahead) {
		datatail->next = p;
		datatail=datatail->next;
	}
	else
		datahead = datatail = p;
	global_flag--;
}
void nl(void)
/*
 * New line
 */
{    if (prm_asmfile) {
       if(outcol > 0) {
                fputc('\n',outputFile);

⌨️ 快捷键说明

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