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

📄 emit_gnu.c

📁 操作系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*	emit_gnu.c - emit GNU assembly			Author: Kees J. Bot *								28 Dec 1993 */#define nil 0#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <string.h>#include <assert.h>#include "asmconv.h"#include "token.h"#include "asm86.h"#include "languages.h"typedef struct mnemonic {	/* GNU as386 mnemonics translation table. */	opcode_t	opcode;	char		*name;} mnemonic_t;static mnemonic_t mnemtab[] = {	{ AAA,		"aaa"		},	{ AAD,		"aad"		},	{ AAM,		"aam"		},	{ AAS,		"aas"		},	{ ADC,		"adc%"		},	{ ADD,		"add%"		},	{ AND,		"and%"		},	{ ARPL,		"arpl"		},	{ BOUND,	"bound%"	},	{ BSF,		"bsf%"		},	{ BSR,		"bsr%"		},	{ BSWAP,	"bswap"		},	{ BT,		"bt%"		},	{ BTC,		"btc%"		},	{ BTR,		"btr%"		},	{ BTS,		"bts%"		},	{ CALL,		"call"		},	{ CALLF,	"lcall"		},	{ CBW,		"cbw"		},	{ CLC,		"clc"		},	{ CLD,		"cld"		},	{ CLI,		"cli"		},	{ CLTS,		"clts"		},	{ CMC,		"cmc"		},	{ CMP,		"cmp%"		},	{ CMPS,		"cmps%"		},	{ CMPXCHG,	"cmpxchg"	},	{ CWD,		"cwd"		},	{ DAA,		"daa"		},	{ DAS,		"das"		},	{ DEC,		"dec%"		},	{ DIV,		"div%"		},	{ DOT_ALIGN,	".align"	},	{ DOT_ASCII,	".ascii"	},	{ DOT_ASCIZ,	".asciz"	},	{ DOT_ASSERT,	".assert"	},	{ DOT_BASE,	".base"		},	{ DOT_BSS,	".bss"		},	{ DOT_COMM,	".comm"		},	{ DOT_DATA,	".data"		},	{ DOT_DATA1,	".byte"		},	{ DOT_DATA2,	".short"	},	{ DOT_DATA4,	".long"		},	{ DOT_DEFINE,	".globl"	},	{ DOT_EXTERN,	".globl"	},	{ DOT_FILE,	".file"		},	{ DOT_LCOMM,	".lcomm"	},	{ DOT_LINE,	".line"		},	{ DOT_LIST,	".list"		},	{ DOT_NOLIST,	".nolist"	},	{ DOT_ROM,	".data"		},	/* Minix -- separate I&D. */	{ DOT_SPACE,	".space"	},	{ DOT_SYMB,	".symb"		},	{ DOT_TEXT,	".text"		},	{ DOT_USE16,	".use16"	},	{ DOT_USE32,	".use32"	},	{ ENTER,	"enter"		},	{ F2XM1,	"f2xm1"		},	{ FABS,		"fabs"		},	{ FADD,		"fadd"		},	{ FADDD,	"faddl"		},	{ FADDP,	"faddp"		},	{ FADDS,	"fadds"		},	{ FBLD,		"fbld"		},	{ FBSTP,	"fbstp"		},	{ FCHS,		"fchs"		},	{ FCLEX,	"fnclex"	},	{ FCOMD,	"fcoml"		},	{ FCOMPD,	"fcompl"	},	{ FCOMPP,	"fcompp"	},	{ FCOMPS,	"fcomps"	},	{ FCOMS,	"fcoms"		},	{ FCOS,		"fcos"		},	{ FDECSTP,	"fdecstp"	},	{ FDIVD,	"fdivl"		},	{ FDIVP,	"fdivp"		},	{ FDIVRD,	"fdivrl"	},	{ FDIVRP,	"fdivrp"	},	{ FDIVRS,	"fdivrs"	},	{ FDIVS,	"fdivs"		},	{ FFREE,	"ffree"		},	{ FIADDL,	"fiaddl"	},	{ FIADDS,	"fiadds"	},	{ FICOM,	"ficom"		},	{ FICOMP,	"ficomp"	},	{ FIDIVL,	"fidivl"	},	{ FIDIVRL,	"fidivrl"	},	{ FIDIVRS,	"fidivrs"	},	{ FIDIVS,	"fidivs"	},	{ FILDL,	"fildl"		},	{ FILDQ,	"fildq"		},	{ FILDS,	"filds"		},	{ FIMULL,	"fimull"	},	{ FIMULS,	"fimuls"	},	{ FINCSTP,	"fincstp"	},	{ FINIT,	"fninit"	},	{ FISTL,	"fistl"		},	{ FISTP,	"fistp"		},	{ FISTS,	"fists"		},	{ FISUBL,	"fisubl"	},	{ FISUBRL,	"fisubrl"	},	{ FISUBRS,	"fisubrs"	},	{ FISUBS,	"fisubs"	},	{ FLD1,		"fld1"		},	{ FLDCW,	"fldcw"		},	{ FLDD,		"fldl"		},	{ FLDENV,	"fldenv"	},	{ FLDL2E,	"fldl2e"	},	{ FLDL2T,	"fldl2t"	},	{ FLDLG2,	"fldlg2"	},	{ FLDLN2,	"fldln2"	},	{ FLDPI,	"fldpi"		},	{ FLDS,		"flds"		},	{ FLDX,		"fldt"		},	{ FLDZ,		"fldz"		},	{ FMULD,	"fmull"		},	{ FMULP,	"fmulp"		},	{ FMULS,	"fmuls"		},	{ FNOP,		"fnop"		},	{ FPATAN,	"fpatan"	},	{ FPREM,	"fprem"		},	{ FPREM1,	"fprem1"	},	{ FPTAN,	"fptan"		},	{ FRNDINT,	"frndint"	},	{ FRSTOR,	"frstor"	},	{ FSAVE,	"fnsave"	},	{ FSCALE,	"fscale"	},	{ FSIN,		"fsin"		},	{ FSINCOS,	"fsincos"	},	{ FSQRT,	"fsqrt"		},	{ FSTCW,	"fnstcw"	},	{ FSTD,		"fstl"		},	{ FSTENV,	"fnstenv"	},	{ FSTPD,	"fstpl"		},	{ FSTPS,	"fstps"		},	{ FSTPX,	"fstpt"		},	{ FSTS,		"fsts"		},	{ FSTSW,	"fstsw"		},	{ FSUBD,	"fsubl"		},	{ FSUBP,	"fsubp"		},	{ FSUBPR,	"fsubpr"	},	{ FSUBRD,	"fsubrl"	},	{ FSUBRS,	"fsubrs"	},	{ FSUBS,	"fsubs"		},	{ FTST,		"ftst"		},	{ FUCOM,	"fucom"		},	{ FUCOMP,	"fucomp"	},	{ FUCOMPP,	"fucompp"	},	{ FXAM,		"fxam"		},	{ FXCH,		"fxch"		},	{ FXTRACT,	"fxtract"	},	{ FYL2X,	"fyl2x"		},	{ FYL2XP1,	"fyl2xp1"	},	{ HLT,		"hlt"		},	{ IDIV,		"idiv%"		},	{ IMUL,		"imul%"		},	{ IN,		"in%"		},	{ INC,		"inc%"		},	{ INS,		"ins%"		},	{ INT,		"int"		},	{ INTO,		"into"		},	{ INVD,		"invd"		},	{ INVLPG,	"invlpg"	},	{ IRET,		"iret"		},	{ IRETD,	"iret"		},	{ JA,		"ja"		},	{ JAE,		"jae"		},	{ JB,		"jb"		},	{ JBE,		"jbe"		},	{ JCXZ,		"jcxz"		},	{ JE,		"je"		},	{ JG,		"jg"		},	{ JGE,		"jge"		},	{ JL,		"jl"		},	{ JLE,		"jle"		},	{ JMP,		"jmp"		},	{ JMPF,		"ljmp"		},	{ JNE,		"jne"		},	{ JNO,		"jno"		},	{ JNP,		"jnp"		},	{ JNS,		"jns"		},	{ JO,		"jo"		},	{ JP,		"jp"		},	{ JS,		"js"		},	{ LAHF,		"lahf"		},	{ LAR,		"lar"		},	{ LDS,		"lds"		},	{ LEA,		"lea%"		},	{ LEAVE,	"leave"		},	{ LES,		"les"		},	{ LFS,		"lfs"		},	{ LGDT,		"lgdt"		},	{ LGS,		"lgs"		},	{ LIDT,		"lidt"		},	{ LLDT,		"lldt"		},	{ LMSW,		"lmsw"		},	{ LOCK,		"lock"		},	{ LODS,		"lods%"		},	{ LOOP,		"loop"		},	{ LOOPE,	"loope"		},	{ LOOPNE,	"loopne"	},	{ LSL,		"lsl"		},	{ LSS,		"lss"		},	{ LTR,		"ltr"		},	{ MOV,		"mov%"		},	{ MOVS,		"movs%"		},	{ MOVSX,	"movswl"	},	{ MOVSXB,	"movsb%"	},	{ MOVZX,	"movzwl"	},	{ MOVZXB,	"movzb%"	},	{ MUL,		"mul%"		},	{ NEG,		"neg%"		},	{ NOP,		"nop"		},	{ NOT,		"not%"		},	{ OR,		"or%"		},	{ OUT,		"out%"		},	{ OUTS,		"outs%"		},	{ POP,		"pop%"		},	{ POPA,		"popa%"		},	{ POPF,		"popf%"		},	{ PUSH,		"push%"		},	{ PUSHA,	"pusha%"	},	{ PUSHF,	"pushf%"	},	{ RCL,		"rcl%"		},	{ RCR,		"rcr%"		},	{ RET,		"ret"		},	{ RETF,		"lret"		},	{ ROL,		"rol%"		},	{ ROR,		"ror%"		},	{ SAHF,		"sahf"		},	{ SAL,		"sal%"		},	{ SAR,		"sar%"		},	{ SBB,		"sbb%"		},	{ SCAS,		"scas%"		},	{ SETA,		"setab"		},	{ SETAE,	"setaeb"	},	{ SETB,		"setbb"		},	{ SETBE,	"setbeb"	},	{ SETE,		"seteb"		},	{ SETG,		"setgb"		},	{ SETGE,	"setgeb"	},	{ SETL,		"setlb"		},	{ SETLE,	"setleb"	},	{ SETNE,	"setneb"	},	{ SETNO,	"setnob"	},	{ SETNP,	"setnpb"	},	{ SETNS,	"setnsb"	},	{ SETO,		"setob"		},	{ SETP,		"setpb"		},	{ SETS,		"setsb"		},	{ SGDT,		"sgdt"		},	{ SHL,		"shl%"		},	{ SHLD,		"shld%"		},	{ SHR,		"shr%"		},	{ SHRD,		"shrd%"		},	{ SIDT,		"sidt"		},	{ SLDT,		"sldt"		},	{ SMSW,		"smsw"		},	{ STC,		"stc"		},	{ STD,		"std"		},	{ STI,		"sti"		},	{ STOS,		"stos%"		},	{ STR,		"str"		},	{ SUB,		"sub%"		},	{ TEST,		"test%"		},	{ VERR,		"verr"		},	{ VERW,		"verw"		},	{ WAIT,		"wait"		},	{ WBINVD,	"wbinvd"	},	{ XADD,		"xadd"		},	{ XCHG,		"xchg%"		},	{ XLAT,		"xlat"		},	{ XOR,		"xor%"		},};static FILE *ef;static long eline= 1;static char *efile;static char *orig_efile;static char *opcode2name_tab[N_OPCODES];static void gnu_putchar(int c)/* LOOK, this programmer checks the return code of putc!  What an idiot, noone * does that! */{	if (putc(c, ef) == EOF) fatal(orig_efile);}static void gnu_printf(const char *fmt, ...){	va_list ap;	va_start(ap, fmt);	if (vfprintf(ef, fmt, ap) == EOF) fatal(orig_efile);	va_end(ap);}void gnu_emit_init(char *file, const char *banner)/* Prepare producing a GNU assembly file. */{	mnemonic_t *mp;	if (file == nil) {		file= "stdout";		ef= stdout;	} else {		if ((ef= fopen(file, "w")) == nil) fatal(file);	}	orig_efile= file;	efile= file;	gnu_printf("/ %s", banner);	/* Initialize the opcode to mnemonic translation table. */	for (mp= mnemtab; mp < arraylimit(mnemtab); mp++) {		assert(opcode2name_tab[mp->opcode] == nil);		opcode2name_tab[mp->opcode]= mp->name;	}

⌨️ 快捷键说明

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