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

📄 outas386.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 5 页
字号:
/* 
Copyright 1994-2003 Free Software Foundation, Inc.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  

This program is derived from the cc68k complier by 
Matthew Brandt (mattb@walkingdog.net) 

You may contact the author of this derivative at:

mailto::camille@bluegrass.net

or by snail mail at:

David Lindauer
850 Washburn Ave Apt 99
Louisville, KY 40222
 */
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "lists.h"
#include "expr.h"
#include "c.h"
#include "gen386.h"
#include "diag.h"
#include "lists.h"                       

extern int prm_cplusplus;
extern HASHREC **templateFuncs;
extern struct _templatelist *templateList;
extern LIST *libincludes;
extern int prm_nodos;
extern char outfile[];
extern int prm_flat, prm_optmult;
extern SYM *currentfunc;
extern int prm_cmangle;
extern HASHREC **gsyms;
extern int phiused;
extern long nextlabel;
extern FILE *outputFile;
extern int global_flag;
extern LIST *localfuncs,  *localdata;
extern OPCODE popn_aaa;
extern OPCODE popn_aad;
extern OPCODE popn_aam;
extern OPCODE popn_aas;
extern OPCODE popn_add;
extern OPCODE popn_adc;
extern OPCODE popn_and;
extern OPCODE popn_arpl;
extern OPCODE popn_bound;
extern OPCODE popn_bsf;
extern OPCODE popn_bsr;
extern OPCODE popn_bswap;
extern OPCODE popn_btc;
extern OPCODE popn_bt;
extern OPCODE popn_btr;
extern OPCODE popn_bts;
extern OPCODE popn_call;
extern OPCODE popn_cbw;
extern OPCODE popn_cwde;
extern OPCODE popn_cwd;
extern OPCODE popn_cdq;
extern OPCODE popn_clc;
extern OPCODE popn_cld;
extern OPCODE popn_cli;
extern OPCODE popn_clts;
extern OPCODE popn_cmc;
extern OPCODE popn_cmp;
extern OPCODE popn_cmps;
extern OPCODE popn_cmpsb;
extern OPCODE popn_cmpsw;
extern OPCODE popn_cmpsd;
extern OPCODE popn_daa;
extern OPCODE popn_das;
extern OPCODE popn_dec;
extern OPCODE popn_div;
extern OPCODE popn_enter;
extern OPCODE popn_hlt;
extern OPCODE popn_idiv;
extern OPCODE popn_imul;
extern OPCODE popn_in;
extern OPCODE popn_inc;
extern OPCODE popn_ins;
extern OPCODE popn_insb;
extern OPCODE popn_insw;
extern OPCODE popn_insd;
extern OPCODE popn_int;
extern OPCODE popn_int3;
extern OPCODE popn_into;
extern OPCODE popn_invd;
extern OPCODE popn_iret;
extern OPCODE popn_iretd;
extern OPCODE popn_jcxz;
extern OPCODE popn_ja;
extern OPCODE popn_jnbe;
extern OPCODE popn_jae;
extern OPCODE popn_jnb;
extern OPCODE popn_jnc;
extern OPCODE popn_jb;
extern OPCODE popn_jc;
extern OPCODE popn_jnae;
extern OPCODE popn_jbe;
extern OPCODE popn_jna;
extern OPCODE popn_je;
extern OPCODE popn_jz;
extern OPCODE popn_jg;
extern OPCODE popn_jnle;
extern OPCODE popn_jl;
extern OPCODE popn_jnge;
extern OPCODE popn_jge;
extern OPCODE popn_jnl;
extern OPCODE popn_jle;
extern OPCODE popn_jng;
extern OPCODE popn_jne;
extern OPCODE popn_jnz;
extern OPCODE popn_jo;
extern OPCODE popn_jno;
extern OPCODE popn_jp;
extern OPCODE popn_jnp;
extern OPCODE popn_jpe;
extern OPCODE popn_jpo;
extern OPCODE popn_js;
extern OPCODE popn_jns;
extern OPCODE popn_jmp;
extern OPCODE popn_lahf;
extern OPCODE popn_lar;
extern OPCODE popn_lds;
extern OPCODE popn_les;
extern OPCODE popn_lfs;
extern OPCODE popn_lgs;
extern OPCODE popn_lss;
extern OPCODE popn_lea;
extern OPCODE popn_leave;
extern OPCODE popn_lgdt;
extern OPCODE popn_lidt;
extern OPCODE popn_lldt;
extern OPCODE popn_lmsw;
extern OPCODE popn_lock;
extern OPCODE popn_lods;
extern OPCODE popn_lodsb;
extern OPCODE popn_lodsw;
extern OPCODE popn_lodsd;
extern OPCODE popn_loop;
extern OPCODE popn_loope;
extern OPCODE popn_loopz;
extern OPCODE popn_loopne;
extern OPCODE popn_loopnz;
extern OPCODE popn_lsl;
extern OPCODE popn_ltr;
extern OPCODE popn_mov;
extern OPCODE popn_movs;
extern OPCODE popn_movsb;
extern OPCODE popn_movsw;
extern OPCODE popn_movsd;
extern OPCODE popn_movsx;
extern OPCODE popn_movzx;
extern OPCODE popn_mul;
extern OPCODE popn_neg;
extern OPCODE popn_not;
extern OPCODE popn_nop;
extern OPCODE popn_or;
extern OPCODE popn_out;
extern OPCODE popn_outs;
extern OPCODE popn_outsb;
extern OPCODE popn_outsw;
extern OPCODE popn_outsd;
extern OPCODE popn_pop;
extern OPCODE popn_popa;
extern OPCODE popn_popad;
extern OPCODE popn_popf;
extern OPCODE popn_popfd;
extern OPCODE popn_push;
extern OPCODE popn_pusha;
extern OPCODE popn_pushad;
extern OPCODE popn_pushf;
extern OPCODE popn_pushfd;
extern OPCODE popn_rcl;
extern OPCODE popn_rcr;
extern OPCODE popn_rdtsc;
extern OPCODE popn_rol;
extern OPCODE popn_ror;
extern OPCODE popn_repnz;
extern OPCODE popn_repz;
extern OPCODE popn_ret;
extern OPCODE popn_retf;
extern OPCODE popn_sahf;
extern OPCODE popn_sal;
extern OPCODE popn_sar;
extern OPCODE popn_shl;
extern OPCODE popn_shr;
extern OPCODE popn_sbb;
extern OPCODE popn_scas;
extern OPCODE popn_scasb;
extern OPCODE popn_scasw;
extern OPCODE popn_scasd;
extern OPCODE popn_seta;
extern OPCODE popn_setnbe;
extern OPCODE popn_setae;
extern OPCODE popn_setnb;
extern OPCODE popn_setnc;
extern OPCODE popn_setb;
extern OPCODE popn_setc;
extern OPCODE popn_setnae;
extern OPCODE popn_setbe;
extern OPCODE popn_setna;
extern OPCODE popn_sete;
extern OPCODE popn_setz;
extern OPCODE popn_setg;
extern OPCODE popn_setnle;
extern OPCODE popn_setl;
extern OPCODE popn_setnge;
extern OPCODE popn_setge;
extern OPCODE popn_setnl;
extern OPCODE popn_setle;
extern OPCODE popn_setng;
extern OPCODE popn_setne;
extern OPCODE popn_setnz;
extern OPCODE popn_seto;
extern OPCODE popn_setno;
extern OPCODE popn_setp;
extern OPCODE popn_setnp;
extern OPCODE popn_setpe;
extern OPCODE popn_setpo;
extern OPCODE popn_sets;
extern OPCODE popn_setns;
extern OPCODE popn_sgdt;
extern OPCODE popn_sidt;
extern OPCODE popn_sldt;
extern OPCODE popn_smsw;
extern OPCODE popn_shld;
extern OPCODE popn_shrd;
extern OPCODE popn_stc;
extern OPCODE popn_std;
extern OPCODE popn_sti;
extern OPCODE popn_stos;
extern OPCODE popn_stosb;
extern OPCODE popn_stosw;
extern OPCODE popn_stosd;
extern OPCODE popn_str;
extern OPCODE popn_sub;
extern OPCODE popn_test;
extern OPCODE popn_verr;
extern OPCODE popn_verw;
extern OPCODE popn_wait;
extern OPCODE popn_wbinvd;
extern OPCODE popn_xchg;
extern OPCODE popn_xlat;
extern OPCODE popn_xlatb;
extern OPCODE popn_xor;
extern OPCODE popn_f2xm1;
extern OPCODE popn_fabs;
extern OPCODE popn_fadd;
extern OPCODE popn_faddp;
extern OPCODE popn_fiadd;
extern OPCODE popn_fchs;
extern OPCODE popn_fclex;
extern OPCODE popn_fnclex;
extern OPCODE popn_fcom;
extern OPCODE popn_fcomp;
extern OPCODE popn_fcompp;
extern OPCODE popn_fcos;
extern OPCODE popn_fdecstp;
extern OPCODE popn_fdiv;
extern OPCODE popn_fdivp;
extern OPCODE popn_fidiv;
extern OPCODE popn_fdivr;
extern OPCODE popn_fdivrp;
extern OPCODE popn_fidivr;
extern OPCODE popn_ffree;
extern OPCODE popn_ficom;
extern OPCODE popn_ficomp;
extern OPCODE popn_fild;
extern OPCODE popn_fincstp;
extern OPCODE popn_finit;
extern OPCODE popn_fninit;
extern OPCODE popn_fist;
extern OPCODE popn_fistp;
extern OPCODE popn_fld;
extern OPCODE popn_fldz;
extern OPCODE popn_fldpi;
extern OPCODE popn_fld1;
extern OPCODE popn_fldl2t;
extern OPCODE popn_fldl2e;
extern OPCODE popn_fldlg2;
extern OPCODE popn_fldln2;
extern OPCODE popn_fldcw;
extern OPCODE popn_fldenv;
extern OPCODE popn_fmul;
extern OPCODE popn_fmulp;
extern OPCODE popn_fimul;
extern OPCODE popn_fpatan;
extern OPCODE popn_fprem;
extern OPCODE popn_fprem1;
extern OPCODE popn_fptan;
extern OPCODE popn_frndint;
extern OPCODE popn_frstor;
extern OPCODE popn_fsave;
extern OPCODE popn_fnsave;
extern OPCODE popn_fscale;
extern OPCODE popn_fsin;
extern OPCODE popn_fsincos;
extern OPCODE popn_fsqrt;
extern OPCODE popn_fst;
extern OPCODE popn_fstp;
extern OPCODE popn_fstcw;
extern OPCODE popn_fstsw;
extern OPCODE popn_fnstcw;
extern OPCODE popn_fnstsw;
extern OPCODE popn_fstenv;
extern OPCODE popn_fnstenv;
extern OPCODE popn_fsub;
extern OPCODE popn_fsubp;
extern OPCODE popn_fisub;
extern OPCODE popn_fsubr;
extern OPCODE popn_fsubrp;
extern OPCODE popn_fisubr;
extern OPCODE popn_ftst;
extern OPCODE popn_fucom;
extern OPCODE popn_fucomp;
extern OPCODE popn_fucompp;
extern OPCODE popn_fwait;
extern OPCODE popn_fxam;
extern OPCODE popn_fxch;
extern OPCODE popn_fxtract;
extern OPCODE popn_fyl2x;
extern OPCODE popn_fyl2xp1;
extern LIST *mpthunklist;


int skipsize = 0;
int addsize = 0;

/*      variable initialization         */

char segregs[] = "CSDSESFSGSSS";

extern int prm_asmfile;
extern int prm_lines, prm_nasm, prm_masm;

struct slit *strtab;

static int uses_float;

MULDIV *muldivlink = 0;
enum e_gt gentype = nogen; /* Current DC type */
enum e_sg curseg = noseg; /* Current seg */
int outcol = 0; /* Curront col (roughly) */
int newlabel;
int needpointer;
static int nosize = 0;
static int virtual_mode;

/* List of opcodes
 * This list MUST be in the same order as the op_ enums 
 */
ASMNAME oplst[] = 
{
    {
        "reserved", op_reserved, 0, 0
    } , 
    {
        "line#", op_reserved, 0, 0
    }
    , 
    {
        "void#", op_void, 0, 0
    }
    , 
    {
        "cmt#", op_reserved, 0, 0
    }
    , 
    {
        "label#", op_reserved, 0, 0
    }
    , 
    {
        "flabel#", op_reserved, 0, 0
    }
    , 
    {
        "seq@", op_reserved, 0, 0
    }
    , 
    {
        "db", op_reserved, 0, 0
    }
    , 
    {
        "dd", op_reserved, 0, 0
    }
    , 
    {
        "blockstart#", op_reserved, 0, 0
    }
    , 
    {
        "blockend#", op_reserved, 0, 0
    }
    , 
    {
        "aaa", op_aaa, 0, &popn_aaa
    }
    , 
    {
        "aad", op_aad, 0, &popn_aad
    }
    , 
    {
        "aam", op_aam, 0, &popn_aam
    }
    , 
    {
        "aas", op_aas, 0, &popn_aas
    }
    , 
    {
        "add", op_add, OPE_MATH, &popn_add
    }
    , 
    {
        "adc", op_adc, OPE_MATH, &popn_adc
    }
    , 
    {
        "and", op_and, OPE_MATH, &popn_and
    }
    , 
    {
        "arpl", op_arpl, OPE_ARPL, &popn_arpl
    }
    , 
    {
        "bound", op_bound, OPE_BOUND, &popn_bound
    }
    , 
    {
        "bsf", op_bsf, OPE_BITSCAN, &popn_bsf
    }
    , 
    {
        "bsr", op_bsr, OPE_BITSCAN, &popn_bsr
    }
    , 
    {
        "bswap", op_bswap, OPE_REG32, &popn_bswap
    }
    , 
    {
        "btc", op_btc, OPE_BIT, &popn_btc
    }
    , 
    {
        "bt", op_bt, OPE_BIT, &popn_bt
    }
    , 
    {
        "btr", op_btr, OPE_BIT, &popn_btr
    }
    , 
    {
        "bts", op_bts, OPE_BIT, &popn_bts
    }
    , 
    {
        "call", op_call, OPE_CALL, &popn_call
    }
    , 
    {
        "cbw", op_cbw, 0, &popn_cbw
    }
    , 
    {
        "cwde", op_cwde, 0, &popn_cwde
    }
    , 
    {
        "cwd", op_cwd, 0, &popn_cwd
    }
    , 
    {
        "cdq", op_cdq, 0, &popn_cdq
    }
    , 
    {
        "clc", op_clc, 0, &popn_clc
    }
    , 
    {
        "cld", op_cld, 0, &popn_cld
    }
    , 
    {
        "cli", op_cli, 0, &popn_cli
    }
    , 
    {
        "clts", op_clts, 0, &popn_clts
    }
    , 
    {
        "cmc", op_cmc, 0, &popn_cmc
    }
    , 
    {
        "cmp", op_cmp, OPE_MATH, &popn_cmp
    }
    , 
    {
        "cmps", op_cmps, OPE_CMPS, &popn_cmps
    }
    , 
    {
        "cmpsb", op_cmpsb, 0, &popn_cmpsb
    }
    , 
    {
        "cmpsw", op_cmpsw, 0, &popn_cmpsw
    }
    , 
    {
        "cmpsd", op_cmpsd, 0, &popn_cmpsd
    }
    , 
    {
        "daa", op_daa, 0, &popn_daa
    }
    , 
    {
        "das", op_das, 0, &popn_das
    }
    , 
    {
        "dec", op_dec, OPE_INCDEC, &popn_dec
    }
    , 
    {
        "div", op_div, OPE_RM, &popn_div
    }
    , 
    {
        "enter", op_enter, OPE_ENTER, &popn_enter
    }
    , 
    {
        "hlt", op_hlt, 0, &popn_hlt
    }
    , 
    {
        "idiv", op_idiv, OPE_RM, &popn_idiv
    }
    , 
    {
        "imul", op_imul, OPE_IMUL, &popn_imul
    }
    , 
    {
        "in", op_in, OPE_IN, &popn_in
    }
    , 
    {
        "inc", op_inc, OPE_INCDEC, &popn_inc
    }
    , 
    {
        "ins", op_ins, OPE_INS, &popn_ins
    }
    , 
    {
        "insb", op_insb, 0, &popn_insb
    }
    , 
    {
        "insw", op_insw, 0, &popn_insw
    }
    , 
    {
        "insd", op_insd, 0, &popn_insd
    }
    , 
    {
        "int", op_int, OPE_IMM8, &popn_int
    }
    , 
    {
        "int3", op_int3, 0, &popn_int3
    }
    , 
    {
        "into", op_into, 0, &popn_into
    }
    , 
    {
        "invd", op_invd, 0, &popn_invd
    }

⌨️ 快捷键说明

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