📄 emit_gnu.c
字号:
/* 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 + -