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

📄 parse_~2.c

📁 操作系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*	parse_bas.c - parse BCC AS assembly		Author: Kees J. Bot *								13 Nov 1994 */#define nil 0#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include "asmconv.h"#include "token.h"#include "asm86.h"#include "languages.h"typedef struct mnemonic {	/* BAS mnemonics translation table. */	char		*name;	opcode_t	opcode;	optype_t	optype;} mnemonic_t;static mnemonic_t mnemtab[] = {			/* This array is sorted. */	{ ".align",	DOT_ALIGN,	PSEUDO },	{ ".ascii",	DOT_ASCII,	PSEUDO },	{ ".asciz",	DOT_ASCIZ,	PSEUDO },	{ ".assert",	DOT_ASSERT,	PSEUDO },	{ ".base",	DOT_BASE,	PSEUDO },	{ ".blkb",	DOT_SPACE,	PSEUDO },	{ ".bss",	DOT_BSS,	PSEUDO },	{ ".byte",	DOT_DATA1,	PSEUDO },	{ ".comm",	DOT_COMM,	PSEUDO },	{ ".data",	DOT_DATA,	PSEUDO },	{ ".define",	DOT_DEFINE,	PSEUDO },	{ ".end",	DOT_END,	PSEUDO },	{ ".even",	DOT_ALIGN,	PSEUDO },	{ ".extern",	DOT_EXTERN,	PSEUDO },	{ ".file",	DOT_FILE,	PSEUDO },	{ ".globl",	DOT_DEFINE,	PSEUDO },	{ ".lcomm",	DOT_LCOMM,	PSEUDO },	{ ".line",	DOT_LINE,	PSEUDO },	{ ".list",	DOT_LIST,	PSEUDO },	{ ".long",	DOT_DATA4,	PSEUDO },	{ ".nolist",	DOT_NOLIST,	PSEUDO },	{ ".rom",	DOT_ROM,	PSEUDO },	{ ".space",	DOT_SPACE,	PSEUDO },	{ ".symb",	DOT_SYMB,	PSEUDO },	{ ".text",	DOT_TEXT,	PSEUDO },	{ ".use16",	DOT_USE16,	PSEUDO },	{ ".use32",	DOT_USE32,	PSEUDO },	{ ".word",	DOT_DATA2,	PSEUDO },	{ ".zerob",	DOT_SPACE,	PSEUDO },	{ ".zerow",	DOT_SPACE,	PSEUDO },	{ "aaa",	AAA,		WORD },	{ "aad",	AAD,		WORD },	{ "aam",	AAM,		WORD },	{ "aas",	AAS,		WORD },	{ "adc",	ADC,		WORD },	{ "add",	ADD,		WORD },	{ "and",	AND,		WORD },	{ "arpl",	ARPL,		WORD },	{ "bc",		JB,		JUMP },	{ "beq",	JE,		JUMP },	{ "bge",	JGE,		JUMP },	{ "bgt",	JG,		JUMP },	{ "bhi",	JA,		JUMP },	{ "bhis",	JAE,		JUMP },	{ "ble",	JLE,		JUMP },	{ "blo",	JB,		JUMP },	{ "blos",	JBE,		JUMP },	{ "blt",	JL,		JUMP },	{ "bnc",	JAE,		JUMP },	{ "bne",	JNE,		JUMP },	{ "bound",	BOUND,		WORD },	{ "br",		JMP,		JUMP },	{ "bsf",	BSF,		WORD },	{ "bsr",	BSR,		WORD },	{ "bswap",	BSWAP,		WORD },	{ "bt",		BT,		WORD },	{ "btc",	BTC,		WORD },	{ "btr",	BTR,		WORD },	{ "bts",	BTS,		WORD },	{ "bz",		JE,		JUMP },	{ "call",	CALL,		JUMP },	{ "callf",	CALLF,		JUMP },	{ "cbw",	CBW,		WORD },	{ "cdq",	CWD,		WORD },	{ "clc",	CLC,		WORD },	{ "cld",	CLD,		WORD },	{ "cli",	CLI,		WORD },	{ "clts",	CLTS,		WORD },	{ "cmc",	CMC,		WORD },	{ "cmp",	CMP,		WORD },	{ "cmps",	CMPS,		WORD },	{ "cmpsb",	CMPS,		BYTE },	{ "cmpxchg",	CMPXCHG,	WORD },	{ "cwd",	CWD,		WORD },	{ "cwde",	CBW,		WORD },	{ "daa",	DAA,		WORD },	{ "das",	DAS,		WORD },	{ "dd",		DOT_DATA4,	PSEUDO },	{ "dec",	DEC,		WORD },	{ "div",	DIV,		WORD },	{ "enter",	ENTER,		WORD },	{ "export",	DOT_DEFINE,	PSEUDO },	{ "f2xm1",	F2XM1,		WORD },	{ "fabs",	FABS,		WORD },	{ "fadd",	FADD,		WORD },	{ "faddd",	FADDD,		WORD },	{ "faddp",	FADDP,		WORD },	{ "fadds",	FADDS,		WORD },	{ "fbld",	FBLD,		WORD },	{ "fbstp",	FBSTP,		WORD },	{ "fchs",	FCHS,		WORD },	{ "fclex",	FCLEX,		WORD },	{ "fcomd",	FCOMD,		WORD },	{ "fcompd",	FCOMPD,		WORD },	{ "fcompp",	FCOMPP,		WORD },	{ "fcomps",	FCOMPS,		WORD },	{ "fcoms",	FCOMS,		WORD },	{ "fcos",	FCOS,		WORD },	{ "fdecstp",	FDECSTP,	WORD },	{ "fdivd",	FDIVD,		WORD },	{ "fdivp",	FDIVP,		WORD },	{ "fdivrd",	FDIVRD,		WORD },	{ "fdivrp",	FDIVRP,		WORD },	{ "fdivrs",	FDIVRS,		WORD },	{ "fdivs",	FDIVS,		WORD },	{ "ffree",	FFREE,		WORD },	{ "fiaddl",	FIADDL,		WORD },	{ "fiadds",	FIADDS,		WORD },	{ "ficom",	FICOM,		WORD },	{ "ficomp",	FICOMP,		WORD },	{ "fidivl",	FIDIVL,		WORD },	{ "fidivrl",	FIDIVRL,	WORD },	{ "fidivrs",	FIDIVRS,	WORD },	{ "fidivs",	FIDIVS,		WORD },	{ "fildl",	FILDL,		WORD },	{ "fildq",	FILDQ,		WORD },	{ "filds",	FILDS,		WORD },	{ "fimull",	FIMULL,		WORD },	{ "fimuls",	FIMULS,		WORD },	{ "fincstp",	FINCSTP,	WORD },	{ "finit",	FINIT,		WORD },	{ "fistl",	FISTL,		WORD },	{ "fistp",	FISTP,		WORD },	{ "fists",	FISTS,		WORD },	{ "fisubl",	FISUBL,		WORD },	{ "fisubrl",	FISUBRL,	WORD },	{ "fisubrs",	FISUBRS,	WORD },	{ "fisubs",	FISUBS,		WORD },	{ "fld1",	FLD1,		WORD },	{ "fldcw",	FLDCW,		WORD },	{ "fldd",	FLDD,		WORD },	{ "fldenv",	FLDENV,		WORD },	{ "fldl2e",	FLDL2E,		WORD },	{ "fldl2t",	FLDL2T,		WORD },	{ "fldlg2",	FLDLG2,		WORD },	{ "fldln2",	FLDLN2,		WORD },	{ "fldpi",	FLDPI,		WORD },	{ "flds",	FLDS,		WORD },	{ "fldx",	FLDX,		WORD },	{ "fldz",	FLDZ,		WORD },	{ "fmuld",	FMULD,		WORD },	{ "fmulp",	FMULP,		WORD },	{ "fmuls",	FMULS,		WORD },	{ "fnop",	FNOP,		WORD },	{ "fpatan",	FPATAN,		WORD },	{ "fprem",	FPREM,		WORD },	{ "fprem1",	FPREM1,		WORD },	{ "fptan",	FPTAN,		WORD },	{ "frndint",	FRNDINT,	WORD },	{ "frstor",	FRSTOR,		WORD },	{ "fsave",	FSAVE,		WORD },	{ "fscale",	FSCALE,		WORD },	{ "fsin",	FSIN,		WORD },	{ "fsincos",	FSINCOS,	WORD },	{ "fsqrt",	FSQRT,		WORD },	{ "fstcw",	FSTCW,		WORD },	{ "fstd",	FSTD,		WORD },	{ "fstenv",	FSTENV,		WORD },	{ "fstpd",	FSTPD,		WORD },	{ "fstps",	FSTPS,		WORD },	{ "fstpx",	FSTPX,		WORD },	{ "fsts",	FSTS,		WORD },	{ "fstsw",	FSTSW,		WORD },	{ "fsubd",	FSUBD,		WORD },	{ "fsubp",	FSUBP,		WORD },	{ "fsubpr",	FSUBPR,		WORD },	{ "fsubrd",	FSUBRD,		WORD },	{ "fsubrs",	FSUBRS,		WORD },	{ "fsubs",	FSUBS,		WORD },	{ "ftst",	FTST,		WORD },	{ "fucom",	FUCOM,		WORD },	{ "fucomp",	FUCOMP,		WORD },	{ "fucompp",	FUCOMPP,	WORD },	{ "fxam",	FXAM,		WORD },	{ "fxch",	FXCH,		WORD },	{ "fxtract",	FXTRACT,	WORD },	{ "fyl2x",	FYL2X,		WORD },	{ "fyl2xp1",	FYL2XP1,	WORD },	{ "hlt",	HLT,		WORD },	{ "idiv",	IDIV,		WORD },	{ "imul",	IMUL,		WORD },	{ "in",		IN,		WORD },	{ "inb",	IN,		BYTE },	{ "inc",	INC,		WORD },	{ "ins",	INS,		WORD },	{ "insb",	INS,		BYTE },	{ "int",	INT,		WORD },	{ "into",	INTO,		JUMP },	{ "invd",	INVD,		WORD },	{ "invlpg",	INVLPG,		WORD },	{ "iret",	IRET,		JUMP },	{ "iretd",	IRETD,		JUMP },	{ "j",		JMP,		JUMP },	{ "ja",		JA,		JUMP },	{ "jae",	JAE,		JUMP },	{ "jb",		JB,		JUMP },	{ "jbe",	JBE,		JUMP },	{ "jc",		JB,		JUMP },	{ "jcxz",	JCXZ,		JUMP },	{ "je",		JE,		JUMP },	{ "jecxz",	JCXZ,		JUMP },	{ "jeq",	JE,		JUMP },	{ "jg",		JG,		JUMP },	{ "jge",	JGE,		JUMP },	{ "jgt",	JG,		JUMP },	{ "jhi",	JA,		JUMP },	{ "jhis",	JAE,		JUMP },	{ "jl",		JL,		JUMP },	{ "jle",	JLE,		JUMP },	{ "jlo",	JB,		JUMP },	{ "jlos",	JBE,		JUMP },	{ "jlt",	JL,		JUMP },	{ "jmp",	JMP,		JUMP },	{ "jmpf",	JMPF,		JUMP },	{ "jna",	JBE,		JUMP },	{ "jnae",	JB,		JUMP },	{ "jnb",	JAE,		JUMP },	{ "jnbe",	JA,		JUMP },	{ "jnc",	JAE,		JUMP },	{ "jne",	JNE,		JUMP },	{ "jng",	JLE,		JUMP },	{ "jnge",	JL,		JUMP },	{ "jnl",	JGE,		JUMP },	{ "jnle",	JG,		JUMP },	{ "jno",	JNO,		JUMP },	{ "jnp",	JNP,		JUMP },	{ "jns",	JNS,		JUMP },	{ "jnz",	JNE,		JUMP },	{ "jo",		JO,		JUMP },	{ "jp",		JP,		JUMP },	{ "js",		JS,		JUMP },	{ "jz",		JE,		JUMP },	{ "lahf",	LAHF,		WORD },	{ "lar",	LAR,		WORD },	{ "lds",	LDS,		WORD },	{ "lea",	LEA,		WORD },	{ "leave",	LEAVE,		WORD },	{ "les",	LES,		WORD },	{ "lfs",	LFS,		WORD },	{ "lgdt",	LGDT,		WORD },	{ "lgs",	LGS,		WORD },	{ "lidt",	LIDT,		WORD },	{ "lldt",	LLDT,		WORD },	{ "lmsw",	LMSW,		WORD },	{ "lock",	LOCK,		WORD },	{ "lods",	LODS,		WORD },	{ "lodsb",	LODS,		BYTE },	{ "loop",	LOOP,		JUMP },	{ "loope",	LOOPE,		JUMP },	{ "loopne",	LOOPNE,		JUMP },	{ "loopnz",	LOOPNE,		JUMP },	{ "loopz",	LOOPE,		JUMP },	{ "lsl",	LSL,		WORD },	{ "lss",	LSS,		WORD },	{ "ltr",	LTR,		WORD },	{ "mov",	MOV,		WORD },	{ "movs",	MOVS,		WORD },	{ "movsb",	MOVS,		BYTE },	{ "movsx",	MOVSX,		WORD },	{ "movzx",	MOVZX,		WORD },	{ "mul",	MUL,		WORD },	{ "neg",	NEG,		WORD },	{ "nop",	NOP,		WORD },	{ "not",	NOT,		WORD },	{ "or",		OR,		WORD },	{ "out",	OUT,		WORD },	{ "outb",	OUT,		BYTE },	{ "outs",	OUTS,		WORD },	{ "outsb",	OUTS,		BYTE },	{ "pop",	POP,		WORD },	{ "popa",	POPA,		WORD },	{ "popad",	POPA,		WORD },	{ "popf",	POPF,		WORD },	{ "popfd",	POPF,		WORD },	{ "push",	PUSH,		WORD },	{ "pusha",	PUSHA,		WORD },	{ "pushad",	PUSHA,		WORD },	{ "pushf",	PUSHF,		WORD },	{ "pushfd",	PUSHF,		WORD },	{ "rcl",	RCL,		WORD },	{ "rcr",	RCR,		WORD },	{ "ret",	RET,		JUMP },	{ "retf",	RETF,		JUMP },	{ "rol",	ROL,		WORD },	{ "ror",	ROR,		WORD },	{ "sahf",	SAHF,		WORD },	{ "sal",	SAL,		WORD },	{ "sar",	SAR,		WORD },	{ "sbb",	SBB,		WORD },	{ "scas",	SCAS,		WORD },	{ "seta",	SETA,		BYTE },	{ "setae",	SETAE,		BYTE },	{ "setb",	SETB,		BYTE },	{ "setbe",	SETBE,		BYTE },	{ "sete",	SETE,		BYTE },	{ "setg",	SETG,		BYTE },	{ "setge",	SETGE,		BYTE },	{ "setl",	SETL,		BYTE },	{ "setna",	SETBE,		BYTE },	{ "setnae",	SETB,		BYTE },	{ "setnb",	SETAE,		BYTE },	{ "setnbe",	SETA,		BYTE },	{ "setne",	SETNE,		BYTE },	{ "setng",	SETLE,		BYTE },	{ "setnge",	SETL,		BYTE },	{ "setnl",	SETGE,		BYTE },	{ "setnle",	SETG,		BYTE },	{ "setno",	SETNO,		BYTE },	{ "setnp",	SETNP,		BYTE },	{ "setns",	SETNS,		BYTE },	{ "seto",	SETO,		BYTE },	{ "setp",	SETP,		BYTE },	{ "sets",	SETS,		BYTE },	{ "setz",	SETE,		BYTE },	{ "sgdt",	SGDT,		WORD },	{ "shl",	SHL,		WORD },	{ "shld",	SHLD,		WORD },	{ "shr",	SHR,		WORD },	{ "shrd",	SHRD,		WORD },	{ "sidt",	SIDT,		WORD },	{ "sldt",	SLDT,		WORD },	{ "smsw",	SMSW,		WORD },	{ "stc",	STC,		WORD },	{ "std",	STD,		WORD },	{ "sti",	STI,		WORD },	{ "stos",	STOS,		WORD },	{ "stosb",	STOS,		BYTE },	{ "str",	STR,		WORD },	{ "sub",	SUB,		WORD },	{ "test",	TEST,		WORD },	{ "verr",	VERR,		WORD },	{ "verw",	VERW,		WORD },	{ "wait",	WAIT,		WORD },	{ "wbinvd",	WBINVD,		WORD },	{ "xadd",	XADD,		WORD },	{ "xchg",	XCHG,		WORD },	{ "xlat",	XLAT,		WORD },	{ "xor",	XOR,		WORD },};void bas_parse_init(char *file)/* Prepare parsing of an BAS assembly file. */{	tok_init(file);}static void zap(void)/* An error, zap the rest of the line. */{	token_t *t;	while ((t= get_token(0))->type != T_EOF && t->symbol != ';')		skip_token(1);}static mnemonic_t *search_mnem(char *name)/* Binary search for a mnemonic.  (That's why the table is sorted.) */{	int low, mid, high;	int cmp;	mnemonic_t *m;	low= 0;	high= arraysize(mnemtab)-1;	while (low <= high) {		mid= (low + high) / 2;		m= &mnemtab[mid];		if ((cmp= strcmp(name, m->name)) == 0) return m;		if (cmp < 0) high= mid-1; else low= mid+1;	}	return nil;}static expression_t *bas_get_C_expression(int *pn)/* Read a "C-like" expression.  Note that we don't worry about precedence, * the expression is printed later like it is read.  If the target language * does not have all the operators (like ~) then this has to be repaired by * changing the source file.  (No problem, you still have one source file * to maintain, not two.) */{	expression_t *e, *a1, *a2;	token_t *t;	if ((t= get_token(*pn))->symbol == '(') {		/* ( expr ): grouping. */		(*pn)++;		if ((a1= bas_get_C_expression(pn)) == nil) return nil;		if (get_token(*pn)->symbol != ')') {			parse_err(1, t, "missing )\n");			del_expr(a1);			return nil;		}		(*pn)++;		e= new_expr();		e->operator= '[';		e->middle= a1;	} else	if (t->type == T_WORD || t->type == T_STRING) {		/* Label, number, or string. */		e= new_expr();		e->operator= t->type == T_WORD ? 'W' : 'S';		e->name= allocate(nil, (t->len+1) * sizeof(e->name[0]));		memcpy(e->name, t->name, t->len+1);		e->len= t->len;		(*pn)++;	} else	if (t->symbol == '+' || t->symbol == '-' || t->symbol == '~') {		/* Unary operator. */		(*pn)++;		if ((a1= bas_get_C_expression(pn)) == nil) return nil;		e= new_expr();		e->operator= t->symbol;		e->middle= a1;	} else	if (t->symbol == '$' && get_token(*pn + 1)->type == T_WORD) {		/* A hexadecimal number. */		t= get_token(*pn + 1);		e= new_expr();		e->operator= 'W';		e->name= allocate(nil, (t->len+3) * sizeof(e->name[0]));		strcpy(e->name, "0x");		memcpy(e->name+2, t->name, t->len+1);		e->len= t->len+2;		(*pn)+= 2;	} else {		parse_err(1, t, "expression syntax error\n");		return nil;	}	switch ((t= get_token(*pn))->symbol) {	case '+':	case '-':	case '*':	case '/':	case '%':	case '&':	case '|':	case '^':	case S_LEFTSHIFT:	case S_RIGHTSHIFT:		(*pn)++;		a1= e;		if ((a2= bas_get_C_expression(pn)) == nil) {			del_expr(a1);			return nil;		}		e= new_expr();		e->operator= t->symbol;

⌨️ 快捷键说明

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