📄 outas386.c
字号:
}
,
{
"test", op_test, OPE_TEST, &popn_test
}
,
{
"verr", op_verr, OPE_RM16, &popn_verr
}
,
{
"verw", op_verw, OPE_RM16, &popn_verw
}
,
{
"wait", op_wait, 0, &popn_wait
}
,
{
"wbinvd", op_wbinvd, 0, &popn_wbinvd
}
,
{
"xchg", op_xchg, OPE_XCHG, &popn_xchg
}
,
{
"xlat", op_xlat, OPE_XLAT, &popn_xlat
}
,
{
"xlatb", op_xlatb, 0, &popn_xlatb
}
,
{
"xor", op_xor, OPE_MATH, &popn_xor
}
,
{
"f2xm1", op_f2xm1, 0, &popn_f2xm1
}
,
{
"fabs", op_fabs, 0, &popn_fabs
}
,
{
"fadd", op_fadd, OPE_FMATH, &popn_fadd
}
,
{
"faddp", op_faddp, OPE_FMATHP, &popn_faddp
}
,
{
"fiadd", op_fiadd, OPE_FMATHI, &popn_fiadd
}
,
{
"fchs", op_fchs, 0, &popn_fchs
}
,
{
"fclex", op_fclex, 0, &popn_fclex
}
,
{
"fnclex", op_fnclex, 0, &popn_fnclex
}
,
{
"fcom", op_fcom, OPE_FCOM, &popn_fcom
}
,
{
"fcomp", op_fcomp, OPE_FCOM, &popn_fcomp
}
,
{
"fcompp", op_fcompp, 0, &popn_fcompp
}
,
{
"fcos", op_fcos, 0, &popn_fcos
}
,
{
"fdecstp", op_fdecstp, 0, &popn_fdecstp
}
,
{
"fdiv", op_fdiv, OPE_FMATH, &popn_fdiv
}
,
{
"fdivp", op_fdivp, OPE_FMATHP, &popn_fdivp
}
,
{
"fidiv", op_fidiv, OPE_FMATHI, &popn_fidiv
}
,
{
"fdivr", op_fdivr, OPE_FMATH, &popn_fdivr
}
,
{
"fdivrp", op_fdivrp, OPE_FMATHP, &popn_fdivrp
}
,
{
"fidivr", op_fidivr, OPE_FMATHI, &popn_fidivr
}
,
{
"ffree", op_ffre, OPE_FREG, &popn_ffree
}
,
{
"ficom", op_ficom, OPE_FICOM, &popn_ficom
}
,
{
"ficomp", op_ficomp, OPE_FICOM, &popn_ficomp
}
,
{
"fild", op_fild, OPE_FILD, &popn_fild
}
,
{
"fincstp", op_fincstp, 0, &popn_fincstp
}
,
{
"finit", op_finit, 0, &popn_finit
}
,
{
"fninit", op_fninit, 0, &popn_fninit
}
,
{
"fist", op_fist, OPE_FIST, &popn_fist
}
,
{
"fistp", op_fistp, OPE_FILD, &popn_fistp
}
,
{
"fld", op_fld, OPE_FLD, &popn_fld
}
,
{
"fldz", op_fldz, 0, &popn_fldz
}
,
{
"fldpi", op_fldpi, 0, &popn_fldpi
}
,
{
"fld1", op_fld1, 0, &popn_fld1
}
,
{
"fldl2t", op_fld2t, 0, &popn_fldl2t
}
,
{
"fldl2e", op_fld2e, 0, &popn_fldl2e
}
,
{
"fldlg2", op_fldlg2, 0, &popn_fldlg2
}
,
{
"fldln2", op_fldln2, 0, &popn_fldln2
}
,
{
"fldcw", op_fldcw, OPE_M16, &popn_fldcw
}
,
{
"fldenv", op_fldenv, OPE_MN, &popn_fldenv
}
,
{
"fmul", op_fmul, OPE_FMATH, &popn_fmul
}
,
{
"fmulp", op_fmulp, OPE_FMATHP, &popn_fmulp
}
,
{
"fimul", op_fimul, OPE_FMATHI, &popn_fimul
}
,
{
"fpatan", op_fpatan, 0, &popn_fpatan
}
,
{
"fprem", op_fprem, 0, &popn_fprem
}
,
{
"fprem1", op_fprem1, 0, &popn_fprem1
}
,
{
"fptan", op_fptan, 0, &popn_fptan
}
,
{
"frndint", op_frndint, 0, &popn_frndint
}
,
{
"frstor", op_frstor, OPE_MN, &popn_frstor
}
,
{
"fsave", op_fsave, OPE_MN, &popn_fsave
}
,
{
"fnsave", op_fnsave, OPE_MN, &popn_fnsave
}
,
{
"fscale", op_fscale, 0, &popn_fscale
}
,
{
"fsin", op_fsin, 0, &popn_fsin
}
,
{
"fsincos", op_fsincos, 0, &popn_fsincos
}
,
{
"fsqrt", op_fsqrt, 0, &popn_fsqrt
}
,
{
"fst", op_fst, OPE_FST, &popn_fst
}
,
{
"fstp", op_fstp, OPE_FSTP, &popn_fstp
}
,
{
"fstcw", op_fstcw, OPE_M16, &popn_fstcw
}
,
{
"fstsw", op_fstsw, OPE_M16, &popn_fstsw
}
,
{
"fnstcw", op_fnstcw, OPE_M16, &popn_fnstcw
}
,
{
"fnstsw", op_fnstsw, OPE_M16, &popn_fnstsw
}
,
{
"fstenv", op_fstenv, OPE_MN, &popn_fstenv
}
,
{
"fnstenv", op_fsntenv, OPE_MN, &popn_fnstenv
}
,
{
"fsub", op_fsub, OPE_FMATH, &popn_fsub
}
,
{
"fsubp", op_fsubp, OPE_FMATHP, &popn_fsubp
}
,
{
"fisub", op_fisub, OPE_FMATHI, &popn_fisub
}
,
{
"fsubr", op_fsubr, OPE_FMATH, &popn_fsubr
}
,
{
"fsubrp", op_fsubrp, OPE_FMATHP, &popn_fsubrp
}
,
{
"fisubr", op_fisubr, OPE_FMATHI, &popn_fisubr
}
,
{
"ftst", op_ftst, 0, &popn_ftst
}
,
{
"fucom", op_fucom, OPE_FUCOM, &popn_fucom
}
,
{
"fucomp", op_fucomp, OPE_FUCOM, &popn_fucomp
}
,
{
"fucompp", op_fucompp, 0, &popn_fucompp
}
,
{
"fwait", op_fwait, 0, &popn_fwait
}
,
{
"fxam", op_fxam, 0, &popn_fxam
}
,
{
"fxch", op_fxch, OPE_FXCH, &popn_fxch
}
,
{
"fxtract", op_fxtract, 0, &popn_fxtract
}
,
{
"fyl2x", op_fyl2x, 0, &popn_fyl2x
}
,
{
"fyl2xp1", op_fyl2xp1, 0, &popn_fyl2xp1
}
,
{
0, 0, 0
}
,
};
/* Init module */
void outcodeini(void)
{
strtab = 0;
gentype = nogen;
curseg = noseg;
outcol = 0;
newlabel = FALSE;
muldivlink = 0;
mpthunklist = 0;
}
//-------------------------------------------------------------------------
void nl(void)
/*
* New line
*/
{
if (prm_asmfile)
{
if (outcol > 0)
{
oputc('\n', outputFile);
outcol = 0;
gentype = nogen;
}
}
}
/* Put an opcode
*/
void outop(char *name)
{
oputc('\t', outputFile);
while (*name)
oputc(toupper(*name++), outputFile);
}
//-------------------------------------------------------------------------
void putop(enum e_op op, AMODE *aps, AMODE *apd, int nooptx)
{
if (prm_nasm)
{
skipsize = FALSE;
addsize = FALSE;
switch (op)
{
case op_lea:
skipsize = TRUE;
break;
case op_push:
addsize = TRUE;
if (!aps->length)
aps->length = BESZ_DWORD;
break;
case op_add:
case op_sub:
case op_adc:
case op_sbb:
case op_imul:
/* yes you can size an imul constant !!!! */
case op_cmp:
case op_and:
case op_or:
case op_xor:
case op_idiv:
if (apd)
addsize = apd->length != 0;
else
{
addsize = TRUE;
if (!aps->length)
aps->length = BESZ_DWORD;
}
break;
}
if (op == op_fwait)
{
outop(oplst[op_fwait].word + 1);
return ;
}
if (!nooptx)
{
switch (op)
{
case op_iretd:
outop("iret");
return ;
case op_pushad:
outop("pusha");
return ;
case op_popad:
outop("popa");
return ;
case op_pushfd:
outop("pushf");
return ;
case op_popfd:
outop("popf");
return ;
}
}
}
if (op > op_fyl2xp1)
DIAG("illegal opcode.");
else
outop(oplst[op].word);
uses_float = (op >= op_f2xm1);
}
//-------------------------------------------------------------------------
char *dumpns(NAMESPACE *ns, char *buf, int *done)
{
if (!ns)
return buf;
buf = dumpns(ns->next, buf, done);
*done = 1;
*buf++ = '@';
strcpy(buf, ns->sp->name + prm_cmangle);
buf += strlen(buf);
return buf;
}
//-------------------------------------------------------------------------
void putsym(char *buf, SYM *sp, char *p)
{
int done = 0;
if (!p)
{
buf[0] = 0;
return ;
}
if (sp->staticlabel)
sprintf(buf, "L_%d", sp->value.i);
else if (sp->alias)
strcpy(buf, sp->alias);
else
{
if (sp->pascaldefn)
{
char *q = buf;
if (prm_cmangle)
p++;
while (*p)
*q++ = toupper(*p++);
*q = 0;
}
else if (sp->isstdcall)
{
if (prm_cmangle)
p++;
strcpy(buf, p);
}
else
{
char *q;
if (sp->mangled && !(sp->tp->type == bt_func || sp->tp->type ==
bt_ifunc))
{
q = dumpns(sp->value.classdata.parentns, buf, &done);
if (done)
{
*q++ = '@';
strcpy(q, p + prm_cmangle);
}
else
strcpy(q, p);
}
else
strcpy(buf, p);
if (prm_cplusplus && prm_asmfile && !prm_nasm)
{
// problematic for compiling templates via ASM and TASM
q = buf;
while (q = strchr(q, '#'))
*q = '%';
}
}
}
}
//-------------------------------------------------------------------------
void putconst(ENODE *offset)
/*
* put a constant to the outputFile file.
*/
{
char buf[512];
SYM *sp;
switch (offset->nodetype)
{
case en_autoreg:
case en_autocon:
case en_icon:
case en_lcon:
case en_iucon:
case en_lucon:
case en_llucon:
case en_llcon:
case en_ccon:
case en_cucon:
case en_absacon:
case en_boolcon:
oprintf(outputFile, "0%lXH", offset->v.i);
break;
case en_fcomplexcon:
case en_rcomplexcon:
case en_lrcomplexcon:
oprintf(outputFile, "%.16e,%.16e", offset->v.c.r, offset->v.c.i);
break;
case en_rcon:
case en_fcon:
case en_lrcon:
case en_fimaginarycon:
case en_rimaginarycon:
case en_lrimaginarycon:
oprintf(outputFile, "%.16e", offset->v.f);
break;
case en_nalabcon:
oprintf(outputFile, "L_%d", offset->v.sp->value.i);
break;
case en_labcon:
oprintf(outputFile, "L_%d", offset->v.i);
break;
case en_napccon:
case en_nacon:
sp = offset->v.sp;
putsym(buf, sp, sp->name);
oprintf(outputFile, "%s", buf);
break;
case en_add:
case en_addstruc:
putconst(offset->v.p[0]);
oprintf(outputFile, "+");
putconst(offset->v.p[1]);
break;
case en_sub:
putconst(offset->v.p[0]);
oprintf(outputFile, "-");
putconst(offset->v.p[1]);
break;
case en_uminus:
oprintf(outputFile, "-");
putconst(offset->v.p[0]);
break;
default:
DIAG("illegal constant node.");
break;
}
}
//-------------------------------------------------------------------------
void putlen(int l)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -