//
//
// This program was written by Sang Cho, associate professor at
// the department of
// computer science and engineering
// chongju university
// language used: gcc
//
// date of second release: August 30, 1998 (alpha version)
//
//
// you can contact me: e-mail address: sangcho@alpha94.chongju.ac.kr
// hitel id: chokhas
// phone number: (0431) 229-8491 +82-431-229-8491
//
// real address: Sang Cho
// Computer and Information Engineering
// ChongJu University
// NaeDok-Dong 36
// ChongJu 360-764
// South Korea
//
// Copyright (C) 1997,1998 by Sang Cho.
//
// Permission is granted to make and distribute verbatim copies of this
// program provided the copyright notice and this permission notice are
// preserved on all copies.
//
// File: print.c
# define max_col 12
# define my_ON 0
# define my_OFF 1
# define WINAPI
# include "disasm.h"
LPVOID WINAPI TranslateFunctionName (char *);
void WINAPI TranslateParameters (char **, char **, char **);
DWORD Get32Address(DWORD);
int isGoodAddress(DWORD);
DWORD AddressCheck(DWORD);
int isThisSecure(DWORD);
int referCount(DWORD);
void showDots();
void e64toasc();
int gotJmpRef = 0;
int specifierFlag = my_OFF;
int lclass=0;
int ref=0;
int dref=0;
int dmark=0;
int printCol=0;
int tempref[8]={0,};
int temppos[8]={0,};
int reg=-1;
char *reg8String[] = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"};
char *reg16String[] = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di"};
char *reg32String[] = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
char *reg64String[] = { "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7"};
char *SregString [] = { "es", "cs", "ss", "ds", "fs", "gs", "##", "##"};
char *mod16String[] = {"bx+si","bx+di","bp+si","bp+di","si","di", "bp", "bx"};
/* *********************************************************************** */
/* Original Part of grammar generated data */
/* *********************************************************************** */
int print_m_byte()
{
if (m_byte>127) {pr2ntf("-%02X",256-m_byte);}
else {pr2ntf("+%02X",m_byte);}
printCol+=3;
return m_byte;
}
int print_m_dword()
{
if (addressOveride) {pr2ntf("%04X",m_dword);}
else {pr2ntf("%08X", m_dword);}
if (addressOveride) printCol+=4; else printCol+=8;
return m_dword;
}
int print_i_byte()
{
if (i_byte>127) {pr2ntf("-%02X",256-i_byte);}
else {pr2ntf("%02X",i_byte);}
if (i_byte>127) printCol+=3; else printCol+=2;
return i_byte;
}
int print_i_byte32()
{
int r;
r = ((i_byte>127)?256-i_byte:i_byte);
if (i_byte>127)
{
if (operandOveride||addressOveride) {pr2ntf("-%04X",r);}
else {pr2ntf("-%08X",r);} printCol+=1;
}
else
{
if (operandOveride||addressOveride) {pr2ntf("%04X",r);}
else {pr2ntf("%08X",r);}
}
if (operandOveride||addressOveride) printCol+=4; else printCol+=8;
return r;
}
int print_i_dword()
{
if (operandOveride||addressOveride) {pr2ntf("%04X", i_dword);}
else {pr2ntf("%08X", i_dword);}
if (operandOveride||addressOveride) printCol+=4; else printCol+=8;
return i_dword;
}
int print_i_word()
{
pr2ntf("%04X", i_word);
printCol+=4;
return i_word;
}
int print_rel8()
{
ref = cur_position + i_col + ((i_byte>127)?i_byte-256:i_byte);
if (addressOveride) {pr2ntf("%04X",ref);}
else {pr2ntf("%08X",ref);}
{ if (i_opcode == 0xEB) lclass = 1; else lclass = 2; }
if (addressOveride) printCol+=4; else printCol+=8;
return ref;
}
int print_rel32()
{
ref = cur_position + i_col + i_dword;
if (addressOveride) {pr2ntf("%04X",ref);}
else {pr2ntf("%08X",ref);}
if (addressOveride) printCol+=4; else printCol+=8;
return ref;
}
int print_moff()
{
prefix();
if(addressOveride) {pr2ntf("[%04X]",i_dword);}
else {pr2ntf("[%08X]",i_dword);}
if (addressOveride) printCol+=6; else printCol+=10;
return i_dword;
}
int r___(int n)
{
switch(n)
{
case 8: pr2ntf("%s", reg8String [regTable[i_mod]]); break;
case 16: pr2ntf("%s", reg16String[regTable[i_mod]]); break;
case 32: pr2ntf("%s", reg32String[regTable[i_mod]]); break;
case 64: pr2ntf("%s", reg64String[regTable[i_mod]]); break;
default: fatalError=100;
}
return i_mod;
}
int mm____()
{
pr2ntf("%s", reg64String[regTable[i_mod]]);
return i_mod;
}
int mmm___()
{
pr2ntf("%s", reg64String[rmTable[i_mod]]);
return i_mod;
}
int rm_m32 (n)
int n;
{
switch(n)
{
case 8: pr2ntf("%s", reg8String [rmTable[i_mod]]); printCol+=2; break;
case 16: pr2ntf("%s", reg16String[rmTable[i_mod]]); printCol+=2; break;
case 32: pr2ntf("%s", reg32String[rmTable[i_mod]]); printCol+=3; break;
case 64: pr2ntf("%s", reg64String[rmTable[i_mod]]); printCol+=3; break;
default: fatalError=101;
}
return i_mod;
}
int rm_m16 (n)
int n;
{
pr2ntf("%s", mod16String[rmTable[i_mod]]);
printCol+=strlen(mod16String[rmTable[i_mod]]);
return i_mod;
}
int reg_s ()
{
pr2ntf("%s", reg32String[regTable[i_sib]]);
printCol+=strlen(reg32String[regTable[i_sib]]);
return i_sib;
}
int base()
{
pr2ntf("%s", reg32String[rmTable[i_sib]]);
printCol+=strlen(reg32String[rmTable[i_sib]]);
return i_sib;
}
int scaledindex()
{
int c;
c=modTable[i_sib];
c=c/2;
if (c>0) c--;
switch(c) /* now c is SS of sib byte */
{
case 0: reg_s(); break;
case 1: pr1ntf("2*"); reg_s(); printCol+=2; break;
case 2: pr1ntf("4*"); reg_s(); printCol+=2; break;
case 3: pr1ntf("8*"); reg_s(); printCol+=2; break;
default: fatalError=103;
}
return i_sib;
}
void specifier (n)
int n;
{
if (nextMode) return;
switch(n)
{
case 8: pr1ntf("byte"); printCol+=4; break;
case 16: pr1ntf("word"); printCol+=4; break;
case 32: pr1ntf("dword"); printCol+=5; break;
case 64: pr1ntf("qword"); printCol+=5; break;
default: break;
}
prefix();
}
int prefix()
{
if (i_psp>1)
{
if (prefixStack[i_psp-2] == 38)
{ pr1ntf (" es:"); printCol+=4; }
else if (prefixStack[i_psp-2] == 46)
{ pr1ntf (" cs:"); printCol+=4; }
else if (prefixStack[i_psp-2] == 54)
{ pr1ntf (" ss:"); printCol+=4; }
else if (prefixStack[i_psp-2] == 62)
{ pr1ntf (" ds:"); printCol+=4; }
else if (prefixStack[i_psp-2] == 100)
{ pr1ntf (" fs:"); printCol+=4; }
else if (prefixStack[i_psp-2] == 101)
{ pr1ntf (" gs:"); printCol+=4; }
}
if (i_psp>0)
{
if (prefixStack[i_psp-1] == 38)
{ pr1ntf (" es:"); printCol+=4; }
else if (prefixStack[i_psp-1] == 46)
{ pr1ntf (" cs:"); printCol+=4; }
else if (prefixStack[i_psp-1] == 54)
{ pr1ntf (" ss:"); printCol+=4; }
else if (prefixStack[i_psp-1] == 62)
{ pr1ntf (" ds:"); printCol+=4; }
else if (prefixStack[i_psp-1] == 100)
{ pr1ntf (" fs:"); printCol+=4; }
else if (prefixStack[i_psp-1] == 101)
{ pr1ntf (" gs:"); printCol+=4; }
}
return 1;
}
int r_m_ (n)
{
if (addressOveride==0) return r_m_32(n);
else return r_m_16(n);
}
int r_m_32 (int n)
{
int c, rr;
rr=32;
c=modTable[i_mod];
switch(c)
{
case 1: specifier(n);
pr1ntf("["); ref = rm_m32(rr); pr1ntf("]");
printCol+=2; return -1;
case 2: specifier(n);
if (sibTable[i_sib]==1) /* sib star */
{
pr1ntf("[");
if (regTable[i_sib]!=4)
{scaledindex(); pr1ntf("+"); gotJmpRef=1;}
ref = print_m_dword(); pr1ntf("]");
printCol+=3;
}
else /* sib non star */
{
pr1ntf("["); base(); pr1ntf("+");
ref = scaledindex(); pr1ntf("]");
printCol+=3;
}
return ref;
case 3: specifier(n);
pr1ntf("["); ref = print_m_dword(); pr1ntf("]");
printCol+=2; return ref;
case 4: specifier(n);
pr1ntf("["); rm_m32(rr);
print_m_byte(); pr1ntf("]");
printCol+=2; return -1;
case 5: specifier(n);
pr1ntf("["); base();
if (regTable[i_sib]!=4)
{pr1ntf("+"); scaledindex(); printCol+=1;}
print_m_byte(); pr1ntf("]");
printCol+=2; return -1;
case 6: specifier(n);
pr1ntf("["); rm_m32(rr);
pr1ntf("+"); ref = print_m_dword(); pr1ntf("]");
printCol+=3; return ref;
case 7: specifier(n);
pr1ntf("["); base(); pr1ntf("+");
if (regTable[i_sib]!=4)
{scaledindex(); pr1ntf("+"); printCol+=1;}
ref = print_m_dword(); pr1ntf("]");
printCol+=3; return ref;
case 8:
rm_m32(n);
return -1;
default: fatalError=105;
}
return 1;
}
int r_m_16 (n)
int n;
{
int c, rr;
rr=16;
c=mod16Table[i_mod];
switch(c)
{
case 1: specifier(n);
pr1ntf("["); rm_m16(rr); pr1ntf("]");
printCol+=2; return -1;
case 2: specifier(n);
pr1ntf("["); ref = print_m_dword(); pr1ntf("]");
printCol+=2; return ref;
case 3: specifier(n);
pr1ntf("["); rm_m16(rr);
print_m_byte(); pr1ntf("]");
printCol+=2; return -1;
case 4: specifier(n);
pr1ntf("["); rm_m16(rr);
pr1ntf("+"); print_m_dword(); pr1ntf("]");
printCol+=3; return -1;
case 5:
rm_m32(n);
return -1;
default: fatalError=105;
}
return 1;
}
int Sreg__()
{
pr2ntf("%s", SregString[regTable[i_mod]]);
printCol+=strlen(SregString[regTable[i_mod]]);
return i_mod;
}
int m16_32()
{
pr1ntf("m16:m32"); ref = r_m_ ( 0);
printCol+=7;
return ref;
}
int m32_32()
{
pr1ntf("m32:m32"); ref = r_m_ ( 0);
printCol+=7;
return ref;
}
int m_____()
{
int rr;
if (operandOveride||addressOveride) rr=16; else rr=32;
return r_m_ (rr);
}
void nmonicprint()
{
if (opclass==1)
{
switch(i_opclass)
{
case 0: print0case();
break;
case 1: print1case();
break;
case 2: print2case();
break;
case 3: print3case();
break;
case 4: print4case();
break;
case 5: print5case();
break;
case 6: print6case();
break;
case 7: print7case();
break;
case 8: print8case();
break;
case 9: print9case();
break;
case 10: print10case();
break;
case 11: print11case();
break;
case 12: print12case();
break;
case 13: print13case();
break;
case 14: print14case();
break;
case 15: print15case();
break;
case 16: print16case();
break;
default: break;
}
}
else
{
switch(i_opclass)
{
case 0: print20case();
break;
case 1: print21case();
break;
case 2: print22case();
break;
case 3: print23case();
break;
case 4: print24case();
break;
case 5: print25case();
break;
default: break;
}
}
} /* end of nmonicprint() */
int addressfix()
{
//if (GotEof) return 0;
if (0<NumberOfBytesProcessed) a_loc = NumberOfBytesProcessed;
cur_position = getRVA(CodeOffset + a_loc + delta)+imageBase;
i_mod=0; i_dword=0; m_dword=0;
return 1;
} /* end of addressprint() */
int addressprint1(int c)
{
static int cc=0;
int d, dd;
BYTE b;
if (GotEof) return 0;
//if (nextMode) return 0;
if (c>1) d=1; else d=c;
if (cc>1)dd=1; else dd=cc;
if (c!=cc && cc==2 && imb >0)
{
bodyprint21();
needspacing=0; imb=0;
showDots();
}
if (d!=dd)
{
pr1ntf("\n"); needspacing=0; imb=0;
showDots();
}
else
{
if (needspacing){ pr1ntf("\n"); needspacing=0; }
}
if (cur_position==entryPoint+imageBase)
{pr1ntf("\n//******************** Program Entry Point ********");}
b=getMap(cur_position);
if (b&0x80) printExportName();
else if (b&0x40) printEntryMark();
else if (b==0x2F) printDataMark();
else if (b==0x2E) printDataMark();
else if (b==0x2D) printDataMark();
else if (b&0x20) printLabelMark();
if (c!=cc)
{
pr2ntf("\n:%08X ", (int)cur_position);
}
else
{
if (c<2)
{pr2ntf("\n:%08X ", (int)cur_position);}
else if (imb==0)
{
pr2ntf("\n:%08X ", (int)cur_position);
imb=0;
}
}
cc=c;
return 1;
} /* end of addressprint() */
int addressprint()
{
addressfix();
addressprint1(1);
return 1;
}
int bodyprint(int c)
{
if (c==0) bodyprint0();
else if (c==1) bodyprint1();
else if (c==2) bodyprint2();
else if (c==3) bodyprint3();
else if (c==4) bodyprint4();
else if (c==5) bodyprint5();
else if (c==6) bodyprint6();
return 1;
}
int bodyprint0()
{
int i,r;
if (GotEof) return 0;
if (finished) {finished=0; return 1;}
r=cur_position;
//if (nextMode==0)
for(i=i_col;i<max_col;i++)pr1ntf(" ");
nmonicprint();
if (nextMode)
{
pushTrace(303);
if (lclass) EnterLabel(lclass, ref, cur_position);
popTrace();
//if (dmc) fatalError=999,dmc=0;
}
else
{
if (getMap(r)&0x10) printString();
}
lclass = 0;
ref = 0;
dref = 0;
a_loc_save=a_loc;
i_col_save=i_col;
i_psp=0;
i_col=0;
addressOveride = 0;
operandOveride = 0;
printCol = 0;
return 1;
}
int bodyprint1()
{
int i, j, n;
if (GotEof) return 0;
pushTrace(302);
if (nextMode>0)
EnterLabel(166, m_dword, cur_position);
else
{
for(i=i_col;i<max_col;i++)pr1ntf(" ");
pr2ntf ("DWORD %08X", m_dword); printCol = 14;
for(i=printCol;i<26;i++)pr1ntf(" ");
n=m_dword; pr1ntf(";; ");
j=n%256; n/=256; if(isprint(j)){pr2ntf("%c",j);}else {pr1ntf(".");}
j=n%256; n/=256; if(isprint(j)){pr2ntf("%c",j);}else {pr1ntf(".");}
j=n%256; n/=256; if(isprint(j)){pr2ntf("%c",j);}else {pr1ntf(".");}
if(isprint(n)){pr2ntf("%c",n);}else {pr1ntf(".");}
}
popTrace();
lclass = 0;
ref = 0;
dref = 0;
a_loc_save=a_loc;
i_col_save=i_col;
i_psp=0;
i_col=0;
operandOveride = 0;
printCol=0;
return 1;
}
int bodyprint2()
{
static int m=16;
BYTE b;
if ((b=getMap(cur_position))&0x30) dmark=cur_position;
switch(lclass)
{
case 515: m=16; break;
case 517: m=10; break;
case 518: case 528:
m= 8; break;
case 524: m=4;
default: m=16;
}
mbytes[imb++]=m_byte;
if (imb==m || (b=getMap(cur_position+1))==0x2F || b==0x1F)
bodyprint21();
// this place is not good place to process EOF case but it is also very effective.
// May.19.1998 sang cho
if (GotEof)
{
bodyprint21();
addressfix();
}
return 1;
}
int bodyprint21()
{
int i, j;
unsigned char c;
double d;
float f;
char s[256];
//if (GotEof) return 0;
for(i=0;i<imb;i++)pr2ntf("%02X ",mbytes[i]);
for( ;i<16; i++)pr1ntf(" "); pr1ntf(" ");
j=lclass;
//for(i=i_col;i<max_col;i++)pr1ntf(" ");
// if (j==515)
//{
//}
//else
if (j==517)
{
e64toasc((PWORD)toFile(dmark),s,16);
pr2ntf(";; %s",s); printCol+=26; if(d<0) printCol++;
}
//else if (j==518)
//{
//}
else if (j==524)
{
f=*(float *)(toFile(dmark));
if(f>=0.) {pr1ntf(";; ");} else {pr1ntf(";; ");}
pr2ntf("%e",f);
}
else if (j==528)
{
d=*(double *)(toFile(dmark));
if(d>=0.) {pr1ntf(";; ");} else {pr1ntf(";; ");}
pr2ntf("%23.16e",d); printCol+=26; if(d<0) printCol++;
}
else
{
for(i=0;i<imb;i++)pr2ntf("%c",isprint(c=mbytes[i])?c:'.');
}
if (getMap(cur_position+1)==0x1F); else lclass=0;
imb = 0;
//lclass = 0;
ref = 0;
dref = 0;
dmark = 0;
a_loc_save=a_loc;
i_col_save=i_col;
i_psp=0;
i_col=0;
operandOveride = 0;
return 1;
}
int bodyprint3()
{
if (GotEof) return 0;
imb++;
lclass = 0;
ref = 0;
dref = 0;
a_loc_save=a_loc;
i_col_save=i_col;
i_psp=0;
i_col=0;
operandOveride = 0;
return 1;
}
int bodyprint4()
{
int i, j, n;
if (GotEof) return 0;
n=stringBuf[0];j=0;
for (i=0;i<n+1;i++)
{if(j++==16) {pr1ntf("\n ");j=1;}pr2ntf("%02X ",stringBuf[i]);}
for(i=j;i<max_col+4;i++)pr1ntf(" "); pr1ntf(" ");
pr2ntf (";;p %c",'"');
n=stringBuf[0];
for (i=1;i<n+1;i++)pr2ntf("%c",stringBuf[i]);
pr2ntf("%c",'"');
lclass = 0;
ref = 0;
dref = 0;
a_loc_save=a_loc;
i_col_save=i_col;
i_psp=0;
i_col=0;
operandOveride = 0;
return 1;
}
int bodyprint5()
{
int i, j;
if (GotEof) return 0;
i=0; j=0;
while(stringBuf[i]>-1)
{if(j++==16) {pr1ntf("\n ");j=1;}pr2ntf("%02X ",stringBuf[i++]);}
for(i=j;i<max_col+4;i++)pr1ntf(" "); pr1ntf(" ");
pr2ntf (";;n %c",'"');
i=0;
while(isprint(stringBuf[i])) pr2ntf("%c",stringBuf[i++]);
pr2ntf("%c",'"');
lclass = 0;
ref = 0;
dref = 0;
a_loc_save=a_loc;
i_col_save=i_col;
i_psp=0;
i_col=0;
operandOveride = 0;
return 1;
}
int bodyprint6()
{
int i, j, n;
if (GotEof) return 0;
pushTrace(392);
if (nextMode>0);
else
{
for(i=i_col;i<max_col;i++) pr1ntf(" ");
pr2ntf ("WORD %04X", m_dword); printCol = 9;
for(i=printCol;i<26;i++) pr1ntf(" ");
n=m_dword; pr1ntf(";; ");
j=n%256; n/=256; if(isprint(j)) {pr2ntf("%c",j);} else {pr1ntf(".");}
if(isprint(n)) {pr2ntf("%c",n);} else {pr1ntf(".");}
}
popTrace();
lclass = 0;
ref = 0;
dref = 0;
a_loc_save=a_loc;
i_col_save=i_col;
i_psp=0;
i_col=0;
operandOveride = 0;
printCol=0;
return 1;
}
int isEntry(DWORD pos)
{
BYTE b=getMap(pos);
if (isGoodAddress(pos)
&&((b&0x40)==0x40)) return 1;
else return 0;
}
int GotName(int class, DWORD pos, DWORD pos1)
{
int i;
int r;
char *p;
_key_ k;
PKEY pk;
r=((int)pos);
if ((int)lpFile<r&&r<(int)lpFile+fsize)
{
k.c_ref=pos; k.c_pos=-1; k.class=0;
pk = searchBtreeX(&k);
if ((pk!=NULL)&&((int)piNameBuff<=TOINT(pk->c_pos))
&&(TOINT(pk->c_pos)<(int)piNameBuff+piNameBuffSize))
{
pr1ntf("\n");
for(i=0;i<28;i++)pr1ntf(" ");
p=strtok((char *)(pk->c_pos),".");
if (class<10) {pr2ntf(";;jmp %s",p);} else {pr2ntf(";;call %s",p);}
pr1ntf(".");
if (*(PBYTE)(r+2)==0x00 && *(PBYTE)(r+3)==0x80)
{
pr2ntf("Thunk:%04X",*(short *)r);
}
else
{
p=TranslateFunctionName((char *)r);
pr2ntf("%s",p);
}
return 1;
}
}
if ((int)peNameBuff<r&&r<(int)peNameBuff+peNameBuffSize)
{
pr1ntf("\n");
for(i=0;i<28;i++)pr1ntf(" ");
p=TranslateFunctionName((char *)r);
pr2ntf(";;%s",p);
return 1;
}
if (isEntry(pos1) && ref!=pos1)
{
pr2ntf(" ;; %08X",(int)pos1);
return 1;
}
return 0;
}
int printName(DWORD pos)
{
DWORD r;
_key_ k, k1, k2, k3;
PKEY pk;
int found;
// this is very tricky.. i need to be extremely careful. oct.31,1997sangcho
k.c_ref=pos; k.c_pos=-1; k.class=0;
pk = searchBtree1(&k);
if(pk==NULL) return 0;
k1=*pk;
k.c_ref=k1.c_pos; k.c_pos=-1; k.class=0;
pk=searchBtreeX(&k);
if (pk!=NULL) found=1;
else found=0;
if (found || AddressCheck(k1.c_pos))
{
r=k1.c_pos;
k.c_ref=r; k.c_pos=-1; k.class=0;
pk = searchBtreeX(&k);
if (pk!=NULL)
{
return GotName(pk->class, pk->c_pos, k1.c_pos);
}
pk = searchBtree1(&k);
if(pk==NULL)
{
if (isEntry(k1.c_pos) && ref!=k1.c_pos)
{
pr2ntf(" ;; %08X",(int)(k1.c_pos));
return 1;
}
return 0;
}
k2=*pk;
k.c_ref=k2.c_pos; k.c_pos=-1; k.class=0;
pk = searchBtreeX(&k);
if(pk==NULL)
{
if (isEntry(k1.c_pos) && ref!=k1.c_pos)
{
pr2ntf(" ;; %08X",(int)(k1.c_pos));
return 1;
}
return 0;
}
k3=*pk;
return GotName(k3.class, k3.c_pos, k1.c_pos);
}
return 1;
}
int printExportName1(DWORD ref)
{
int r;
_key_ k;
PKEY pk;
PBYTE p;
k.c_ref=ref; k.c_pos=-1; k.class=0;
pk = searchBtreeX(&k);
if(pk==NULL) return 0;
r=((int)(pk->c_pos));
if ((int)peNameBuff<r&&r<(int)peNameBuff+peNameBuffSize)
{
p=TranslateFunctionName((char *)r);
pr2ntf("%s",p);
}
return 1;
}
int printExportName()
{
BYTE b, d;
d=getByteFile(cur_position);
if (d==0xC3)
{
b=getMap(cur_position);
if (b&0x40) return printEntryMark();
if (b&0x20) return printLabelMark();
return 1;
}
pr1ntf("\n=========\n");
printExportName1(cur_position);
pr1ntf("\n=========");
return 1;
}
int printEntryMark()
{
pr1ntf("\n=========");
return 1;
}
int printLabelMark()
{
pr1ntf("\n---------");
return 1;
}
int printDataMark()
{
_key_ k;
PKEY pk;
int c;
k.c_ref=cur_position; k.c_pos=-1; k.class=0;
pk = searchBtree3(&k);
if (pk==NULL) {pr1ntf("\n---------");return 1;}
c=pk->class; lclass=c;
if (c==514) {pr1ntf("\n#########..DWORD..");}
else if (c==515) {pr1ntf("\n#########..14/24bytes.");}
else if (c==516) {pr1ntf("\n#########..WORD...");}
else if (c==517) {pr1ntf("\n#########..80real..");}
else if (c==518) {pr1ntf("\n#########..8bytes...");}
else if (c==524) {pr1ntf("\n#########..32real.");}
else if (c==528) {pr1ntf("\n#########..64real.");}
else {pr1ntf("\n#########");}
return 1;
}
int printString()
{
DWORD r;
_key_ k;
PKEY pk;
PBYTE p;
k.c_ref=cur_position; k.c_pos=-1; k.class=0;
pk = searchBtree1(&k);
if(pk==NULL) return 0;
r=pk->c_pos;
p=toFile(r);
pr1ntf("\n (StringData)");
pr2ntf("%c",'"');
while(isprint(*p)) {pr2ntf("%c",*p);p++;}
if (*p==0x0D && *(p+1)==0x0A) {pr1ntf(" <cr><lf>");}
else if (*p==0x0A)
{
pr1ntf(" <lf>");
if (*(p+1)==0x0A) {pr1ntf(" <lf>");}
}
else if (*p==0x09)
{
pr1ntf(" <t>");
if (*(p+1)==0x09) {pr1ntf(" <t>");}
}
pr2ntf("%c",'"');
return 1;
}
int print0case()
{
switch(i_opcode)
{
case 0x06: pr1ntf("push es"); printCol+=7; break;
case 0x07: pr1ntf("pop es"); printCol+=6; break;
case 0x0E: pr1ntf("push cs"); printCol+=7; break;
case 0x16: pr1ntf("push ss"); printCol+=7; break;
case 0x17: pr1ntf("pop ss"); printCol+=6; break;
case 0x1E: pr1ntf("push ds"); printCol+=7; break;
case 0x1F: pr1ntf("pop ds"); printCol+=6; break;
case 0x27: pr1ntf("daa"); printCol+=3; break;
case 0x2F: pr1ntf("das"); printCol+=3; break;
case 0x37: pr1ntf("aaa"); printCol+=3; break;
case 0x3F: pr1ntf("aas"); printCol+=3; break;
case 0x40: if (operandOveride){pr1ntf("inc ax"); printCol+=6;}
else {pr1ntf("inc eax");printCol+=7;}
break;
case 0x41: if (operandOveride){pr1ntf("inc cx"); printCol+=6;}
else {pr1ntf("inc ecx");printCol+=7;}
break;
case 0x42: if (operandOveride){pr1ntf("inc dx"); printCol+=6;}
else {pr1ntf("inc edx");printCol+=7;}
break;
case 0x43: if (operandOveride){pr1ntf("inc bx"); printCol+=6;}
else {pr1ntf("inc ebx");printCol+=7;}
break;
case 0x44: if (operandOveride){pr1ntf("inc sp"); printCol+=6;}
else {pr1ntf("inc esp");printCol+=7;}
break;
case 0x45: if (operandOveride){pr1ntf("inc bp"); printCol+=6;}
else {pr1ntf("inc ebp");printCol+=7;}
break;
case 0x46: if (operandOveride){pr1ntf("inc si"); printCol+=6;}
else {pr1ntf("inc esi");printCol+=7;}
break;
case 0x47: if (operandOveride){pr1ntf("inc di"); printCol+=6;}
else {pr1ntf("inc edi");printCol+=7;}
break;
case 0x48: if (operandOveride){pr1ntf("dec ax"); printCol+=6;}
else {pr1ntf("dec eax");printCol+=7;}
break;
case 0x49: if (operandOveride){pr1ntf("dec cx"); printCol+=6;}
else {pr1ntf("dec ecx");printCol+=7;}
break;
case 0x4A: if (operandOveride){pr1ntf("dec dx"); printCol+=6;}
else {pr1ntf("dec edx");printCol+=7;}
break;
case 0x4B: if (operandOveride){pr1ntf("dec bx"); printCol+=6;}
else {pr1ntf("dec ebx");printCol+=7;}
break;
case 0x4C: if (operandOveride){pr1ntf("dec sp"); printCol+=6;}
else {pr1ntf("dec esp");printCol+=7;}
break;
case 0x4D: if (operandOveride){pr1ntf("dec bp"); printCol+=6;}
else {pr1ntf("dec ebp");printCol+=7;}
break;
case 0x4E: if (operandOveride){pr1ntf("dec si"); printCol+=6;}
else {pr1ntf("dec esi");printCol+=7;}
break;
case 0x4F: if (operandOveride){pr1ntf("dec di"); printCol+=6;}
else {pr1ntf("dec edi");printCol+=7;}
break;
case 0x50: if (operandOveride){pr1ntf("push ax"); printCol+=7;}
else {pr1ntf("push eax");printCol+=8;}
break;
case 0x51: if (operandOveride){pr1ntf("push cx"); printCol+=7;}
else {pr1ntf("push ecx");printCol+=8;}
break;
case 0x52: if (operandOveride){pr1ntf("push dx"); printCol+=7;}
else {pr1ntf("push edx");printCol+=8;}
break;
case 0x53: if (operandOveride){pr1ntf("push bx"); printCol+=7;}
else {pr1ntf("push ebx");printCol+=8;}
break;
case 0x54: if (operandOveride){pr1ntf("push sp"); printCol+=7;}
else {pr1ntf("push esp");printCol+=8;}
break;
case 0x55: if (operandOveride){pr1ntf("push bp"); printCol+=7;}
else {pr1ntf("push ebp");printCol+=8;}
break;
case 0x56: if (operandOveride){pr1ntf("push si"); printCol+=7;}
else {pr1ntf("push esi");printCol+=8;}
break;
case 0x57: if (operandOveride){pr1ntf("push di"); printCol+=7;}
else {pr1ntf("push edi");printCol+=8;}
break;
case 0x58: if (operandOveride){pr1ntf("pop ax"); printCol+=6;}
else {pr1ntf("pop eax");printCol+=7;}
break;
case 0x59: if (operandOveride){pr1ntf("pop cx"); printCol+=6;}
else {pr1ntf("pop ecx");printCol+=7;}
break;
case 0x5A: if (operandOveride){pr1ntf("pop dx"); printCol+=6;}
else {pr1ntf("pop edx");printCol+=7;}
break;
case 0x5B: if (operandOveride){pr1ntf("pop bx"); printCol+=6;}
else {pr1ntf("pop ebx");printCol+=7;}
break;
case 0x5C: if (operandOveride){pr1ntf("pop sp"); printCol+=6;}
else {pr1ntf("pop esp");printCol+=7;}
break;
case 0x5D: if (operandOveride){pr1ntf("pop bp"); printCol+=6;}
else {pr1ntf("pop ebp");printCol+=7;}
break;
case 0x5E: if (operandOveride){pr1ntf("pop si"); printCol+=6;}
else {pr1ntf("pop esi");printCol+=7;}
break;
case 0x5F: if (operandOveride){pr1ntf("pop di"); printCol+=6;}
else {pr1ntf("pop edi");printCol+=7;}
break;
case 0x60: pr1ntf("pushad"); printCol+=6; break;
case 0x61: pr1ntf("popad"); printCol+=5; break;
case 0x6C: pr1ntf("ins byte, port[dx]"); printCol+=18; break;
case 0x6D: pr1ntf("ins dword, port[dx]"); printCol+=19; break;
case 0x6E: pr1ntf("outs port[dx], byte"); printCol+=19; break;
case 0x6F: pr1ntf("outs port[dx], dword"); printCol+=20; break;
case 0x90: pr1ntf("nop"); printCol+=3; break;
case 0x91: if (operandOveride){pr1ntf("xchg ax, cx") ;printCol+=11;}
else {pr1ntf("xchg eax, ecx");printCol+=13;}
break;
case 0x92: if (operandOveride){pr1ntf("xchg ax, dx") ;printCol+=11;}
else {pr1ntf("xchg eax, edx");printCol+=13;}
break;
case 0x93: if (operandOveride){pr1ntf("xchg ax, bx") ;printCol+=11;}
else {pr1ntf("xchg eax, ebx");printCol+=13;}
break;
case 0x94: if (operandOveride){pr1ntf("xchg ax, sp") ;printCol+=11;}
else {pr1ntf("xchg eax, esp");printCol+=13;}
break;
case 0x95: if (operandOveride){pr1ntf("xchg ax, bp") ;printCol+=11;}
else {pr1ntf("xchg eax, ebp");printCol+=13;}
break;
case 0x96: if (operandOveride){pr1ntf("xchg ax, si") ;printCol+=11;}
else {pr1ntf("xchg eax, esi");printCol+=13;}
break;
case 0x97: if (operandOveride){pr1ntf("xchg ax, di") ;printCol+=11;}
else {pr1ntf("xchg eax, edi");printCol+=13;}
break;
case 0x98: pr1ntf("cbw"); printCol+=3; break;
case 0x99: if (operandOveride) {pr1ntf("cwd");}
else {pr1ntf("cdq");} printCol+=3;
break;
case 0x9C: pr1ntf("pushfd"); printCol+=6; break;
case 0x9D: pr1ntf("popfd"); printCol+=5; break;
case 0x9E: pr1ntf("sahf"); printCol+=4; break;
case 0x9F: pr1ntf("lahf"); printCol+=4; break;
case 0xA4: pr1ntf("movsb"); printCol+=5; break;
case 0xA5: if (operandOveride) {pr1ntf ("movsw");}
else {pr1ntf ("movsd");} printCol+=5;
break;
case 0xA6: pr1ntf("cmpsb"); printCol+=5; break;
case 0xA7: if (operandOveride) {pr1ntf ("cmpsw");}
else {pr1ntf ("cmpsd");} printCol+=5;
break;
case 0xAA: pr1ntf("stosb"); printCol+=5; break;
case 0xAB: if (operandOveride) {pr1ntf ("stosw");}
else {pr1ntf ("stosd");} printCol+=5;
break;
case 0xAC: pr1ntf("lodsb"); printCol+=5; break;
case 0xAD: if (operandOveride) {pr1ntf ("lodsw");}
else {pr1ntf ("lodsd");} printCol+=5;
break;
case 0xAE: pr1ntf("scasb"); printCol+=5; break;
case 0xAF: if (operandOveride) {pr1ntf ("scasw");}
else {pr1ntf ("scasd");} printCol+=5;
break;
case 0xC3: pr1ntf("ret"); needspacing=1; printCol+=3;
lastAnchor=cur_position+i_col-1;
needJump=1; needJumpNext=cur_position+i_col;
pushTrace(145);
if(nextMode>0) orMap(lastAnchor, 0x80);
popTrace();
break;
case 0xC9: pr1ntf("leave"); printCol+=5; break;
case 0xCB: pr1ntf("ret(far)"); needspacing=1; printCol+=8;
lastAnchor=cur_position+i_col-1;
needJump=1; needJumpNext=cur_position+i_col;
pushTrace(146);
if(nextMode>0) orMap(lastAnchor, 0x80);
popTrace();
//leaveFlag=cur_position+i_col;
break;
case 0xCC: pr1ntf("int 03"); printCol+=6; break;
case 0xCE: pr1ntf("into"); printCol+=4; break;
case 0xCF: if (operandOveride){pr1ntf ("iret"); printCol+=4;}
else {pr1ntf ("iretd");printCol+=5;}
break;
case 0xD7: pr1ntf("xlatb"); printCol+=5; break;
case 0xEC: pr1ntf("in al, port[dx]"); printCol+=15; break;
case 0xED: if (operandOveride){pr1ntf ("in ax, port[dx]"); printCol+=15;}
else {pr1ntf ("in eax, port[dx]");printCol+=16;}
break;
case 0xEE: pr1ntf("out port[dx], al"); printCol+=16; break;
case 0xEF: if (operandOveride){pr1ntf ("out port[dx], ax"); printCol+=16;}
else {pr1ntf ("out port[dx], eax");printCol+=17;}
break;
case 0xF0: pr1ntf("lock"); printCol+=4; break;
case 0xF4: pr1ntf("hlt"); printCol+=3; break;
case 0xF5: pr1ntf("cmc"); printCol+=3; break;
case 0xF8: pr1ntf("clc"); printCol+=3; break;
case 0xF9: pr1ntf("stc"); printCol+=3; break;
case 0xFA: pr1ntf("cli"); printCol+=3; break;
case 0xFB: pr1ntf("sti"); printCol+=3; break;
case 0xFC: pr1ntf("cld"); printCol+=3; break;
case 0xFD: pr1ntf("std"); printCol+=3; break;
default: fatalError=107;return -1;
}
return 0;
}
int print1case()
{
switch(i_opcode)
{
case 0x04: pr1ntf("add al, "); print_i_byte(); printCol+=8; break;
case 0x0C: pr1ntf("or al, "); print_i_byte(); printCol+=7; break;
case 0x14: pr1ntf("adc al, "); print_i_byte(); printCol+=8; break;
case 0x1C: pr1ntf("sbb al, "); print_i_byte(); printCol+=8; break;
case 0x24: pr1ntf("and al, "); print_i_byte(); printCol+=8; break;
case 0x2C: pr1ntf("sub al, "); print_i_byte(); printCol+=8; break;
case 0x34: pr1ntf("xor al, "); print_i_byte(); printCol+=8; break;
case 0x3C: pr1ntf("cmp al, "); print_i_byte(); printCol+=8; break;
case 0x6A: pr1ntf("push "); print_i_byte32(); printCol+=5; break;
case 0x70: pr1ntf("jo "); print_rel8(); printCol+=3; break;
case 0x71: pr1ntf("jno "); print_rel8(); printCol+=4; break;
case 0x72: pr1ntf("jc "); print_rel8(); printCol+=3; break;
case 0x73: pr1ntf("jae "); print_rel8(); printCol+=4; break;
case 0x74: pr1ntf("je "); print_rel8(); printCol+=3; break;
case 0x75: pr1ntf("jne "); print_rel8(); printCol+=4; break;
case 0x76: pr1ntf("jbe "); print_rel8(); printCol+=4; break;
case 0x77: pr1ntf("ja "); print_rel8(); printCol+=3; break;
case 0x78: pr1ntf("js "); print_rel8(); printCol+=3; break;
case 0x79: pr1ntf("jns "); print_rel8(); printCol+=4; break;
case 0x7A: pr1ntf("jpe "); print_rel8(); printCol+=4; break;
case 0x7B: pr1ntf("jpo "); print_rel8(); printCol+=4; break;
case 0x7C: pr1ntf("jl "); print_rel8(); printCol+=3; break;
case 0x7D: pr1ntf("jge "); print_rel8(); printCol+=4; break;
case 0x7E: pr1ntf("jle "); print_rel8(); printCol+=4; break;
case 0x7F: pr1ntf("jg "); print_rel8(); printCol+=3; break;
case 0xA8: pr1ntf("test al, "); print_i_byte(); printCol+=9; break;
case 0xB0: pr1ntf("mov al, "); print_i_byte(); printCol+=8; break;
case 0xB1: pr1ntf("mov cl, "); print_i_byte(); printCol+=8; break;
case 0xB2: pr1ntf("mov dl, "); print_i_byte(); printCol+=8; break;
case 0xB3: pr1ntf("mov bl, "); print_i_byte(); printCol+=8; break;
case 0xB4: pr1ntf("mov ah, "); print_i_byte(); printCol+=8; break;
case 0xB5: pr1ntf("mov ch, "); print_i_byte(); printCol+=8; break;
case 0xB6: pr1ntf("mov dh, "); print_i_byte(); printCol+=8; break;
case 0xB7: pr1ntf("mov bh, "); print_i_byte(); printCol+=8; break;
case 0xCD: pr1ntf("int "); print_i_byte(); printCol+=4; break;
case 0xD4: pr1ntf("aam "); printCol+=4; break;
case 0xD5: pr1ntf("aad "); printCol+=4; break;
case 0xE0: pr1ntf("loopne "); print_rel8(); printCol+=7; break;
case 0xE1: pr1ntf("loope "); print_rel8(); printCol+=6; break;
case 0xE2: pr1ntf("loop "); print_rel8(); printCol+=5; break;
case 0xE3: pr1ntf("jecxz "); print_rel8(); printCol+=6; break;
case 0xE4: pr1ntf("in al, port["); print_i_byte(); pr1ntf("]"); printCol+=13; break;
case 0xE5: pr1ntf("in eax, port[");print_i_byte(); pr1ntf("]"); printCol+=14; break;
case 0xE6: pr1ntf("out port["); print_i_byte(); pr1ntf("], al"); printCol+=14; break;
case 0xE7: pr1ntf("out port["); print_i_byte(); pr1ntf("], eax");printCol+=15; break;
case 0xEB: pr1ntf("jmp "); ref=print_rel8(); printCol+=4;
if (nextMode>0)
{
if (isThisSecure(ref) || referCount(ref)>2 ||
(opclassSave==2 && (opsave&0x80)) )
{
lastAnchor=cur_position+i_col-1;
pushTrace(147);
orMap(lastAnchor, 0x80);
popTrace();
}
}
break;
default: fatalError=109;return -1;
}
return 0;
}
int print2case()
{
if (i_opcode==0xC2)
{
pr2ntf("ret %04X", i_word); needspacing=1;
needJump=1; needJumpNext=cur_position+i_col;
}
else
{
pr2ntf("ret %04X", i_word); needspacing=1;
needJump=1; needJumpNext=cur_position+i_col;
}
printCol+=8;
lastAnchor = cur_position+i_col-1;
pushTrace(148);
if(nextMode>0) orMap(lastAnchor, 0x80);
popTrace();
//leaveFlag=cur_position+i_col;
return 0;
}
int print3case()
{
pr2ntf("enter %04X, ", i_word); print_i_byte();
printCol+=10;
return 0;
}
int print4case()
{
switch(i_opcode)
{
case 0x05: if (operandOveride){pr1ntf ("add ex, "); printCol+=8;}
else {pr1ntf ("add eax, ");printCol+=9;}
print_i_dword();
break;
case 0x0D: if (operandOveride){pr1ntf ("or ax, "); printCol+=7;}
else {pr1ntf ("or eax, "); printCol+=8;}
print_i_dword();
break;
case 0x15: if (operandOveride){pr1ntf ("adc ax, "); printCol+=8;}
else {pr1ntf ("adc eax, ");printCol+=9;}
print_i_dword();
break;
case 0x1D: if (operandOveride){pr1ntf ("sbb ax, "); printCol+=8;}
else {pr1ntf ("sbb eax, ");printCol+=9;}
print_i_dword();
break;
case 0x25: if (operandOveride){pr1ntf ("and ax, "); printCol+=8;}
else {pr1ntf ("and eax, ");printCol+=9;}
print_i_dword();
break;
case 0x2D: if (operandOveride){pr1ntf ("sub ax, "); printCol+=8;}
else {pr1ntf ("sub eax, ");printCol+=9;}
print_i_dword();
break;
case 0x35: if (operandOveride){pr1ntf ("xor ax, "); printCol+=8;}
else {pr1ntf ("xor eax, ");printCol+=9;}
print_i_dword();
break;
case 0x3D: if (operandOveride){pr1ntf ("cmp ax, "); printCol+=8;}
else {pr1ntf ("cmp eax, ");printCol+=9;}
print_i_dword();
break;
case 0x68: pr1ntf("push "); ref=print_i_dword(); // this is OK
// well I really don't know it is reasonably safe to do this.
// I think when we push some (possible) address references into stack
// there is strong reason to do so. that's why i am doing this. i guess...
lclass=512; printCol+=5;
break;
case 0xA0: pr1ntf("mov al, byte"); print_moff(); printCol+=12;
break;
case 0xA1: if (operandOveride){pr1ntf ("mov ax, word"); printCol+=12;}
else {pr1ntf ("mov eax, dword");printCol+=14;}
ref=print_moff();
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=1024;}
break;
case 0xA2: pr1ntf("mov byte");print_moff();pr1ntf(", al");printCol+=12;
break;
case 0xA3: if (operandOveride){pr1ntf ("mov word"); printCol+=12;}
else {pr1ntf ("mov dword");printCol+=14;}
print_moff();
if (operandOveride){pr1ntf (", ax");}
else {pr1ntf (", eax");}
break;
case 0xA9: if (operandOveride){pr1ntf ("test ax, "); printCol+= 9;}
else {pr1ntf ("test eax, ");printCol+=10;}
print_i_dword();
break;
case 0xB8: if (operandOveride){pr1ntf ("mov ax, "); printCol+=8;}
else {pr1ntf ("mov eax, ");printCol+=9;}
ref=print_i_dword();lclass=1024;
break;
case 0xB9: if (operandOveride){pr1ntf ("mov cx, "); printCol+=8;}
else {pr1ntf ("mov ecx, ");printCol+=9;}
ref=print_i_dword();lclass=1024;
break;
case 0xBA: if (operandOveride){pr1ntf ("mov dx, "); printCol+=8;}
else {pr1ntf ("mov edx, ");printCol+=9;}
ref=print_i_dword();lclass=1024;
break;
case 0xBB: if (operandOveride){pr1ntf ("mov bx, "); printCol+=8;}
else {pr1ntf ("mov ebx, ");printCol+=9;}
ref=print_i_dword();lclass=1024;
break;
case 0xBC: if (operandOveride){pr1ntf ("mov sp, "); printCol+=8;}
else {pr1ntf( "mov esp, ");printCol+=9;}
ref=print_i_dword();lclass=1024;
break;
case 0xBD: if (operandOveride){pr1ntf ("mov bp, "); printCol+=8;}
else {pr1ntf ("mov ebp, ");printCol+=9;}
ref=print_i_dword();lclass=1024;
break;
case 0xBE: if (operandOveride){pr1ntf ("mov si, "); printCol+=8;}
else {pr1ntf ("mov esi, ");printCol+=9;}
ref=print_i_dword();lclass=1024;
break;
case 0xBF: if (operandOveride){pr1ntf ("mov di, "); printCol+=8;}
else {pr1ntf ("mov edi, ");printCol+=9;}
ref=print_i_dword();lclass=1024;
break;
case 0xE8: pr1ntf("call ");
lclass = 11; printCol+=5;
ref = print_rel32();
needCall=1;
if (nextMode) {
if (isGoodAddress(ref))
{
needCallRef=ref;
needCallNext=cur_position+i_col;
lastAnchor=cur_position+i_col-1;
pushTrace(158);
if(nextMode>0) orMap(lastAnchor, 0x80);
popTrace();
}
else fatalError=-18;
}
else printName(cur_position);
break;
case 0xE9: pr1ntf("jmp "); ref = print_rel32();
lclass = 3; printCol+=4;
lastAnchor=cur_position+i_col-1;
needJump=1; needJumpNext=cur_position+i_col;
if (nextMode>0)
{
if (! isGoodAddress(ref)) {lclass=0; fatalError=990;}
else
{
pushTrace(149);
orMap(lastAnchor, 0x80);
popTrace();
}
}
else printName(cur_position);
//leaveFlag=cur_position+i_col;
break;
default: fatalError=111;return -1;
}
return 0;
}
int print5case()
{
if (i_opcode==0x9A)
{
pr3ntf("call far %04X:%08X", i_word,i_dword);
{lclass=15; ref=i_dword;}
printCol+=22;
}
else
{
pr3ntf("jmp far %04X:%08X", i_word,i_dword);
needJump=1; needJumpNext=cur_position+i_col;
{lclass=7; ref=i_dword;}
printCol+=21;
}
return 0;
}
int print6case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
switch(i_opcode)
{
case 0x00: pr1ntf("add "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x01: pr1ntf("add "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x02: pr1ntf("add "); r___( 8); pr1ntf(", "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x03: pr1ntf("add "); r___(rr); pr1ntf(", "); ref=r_m_(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x08: pr1ntf("or "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x09: pr1ntf("or "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x0A: pr1ntf("or "); r___( 8); pr1ntf(", "); ref=r_m_( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x0B: pr1ntf("or "); r___(rr); pr1ntf(", "); ref=r_m_(rr); printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x10: pr1ntf("adc "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x11: pr1ntf("adc "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x12: pr1ntf("adc "); r___( 8); pr1ntf(", "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x13: pr1ntf("adc "); r___(rr); pr1ntf(", "); ref=r_m_(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x18: pr1ntf("sbb "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x19: pr1ntf("sbb "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x1A: pr1ntf("sbb "); r___( 8); pr1ntf(", "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x1B: pr1ntf("sbb "); r___(rr); pr1ntf(", "); ref=r_m_(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x20: pr1ntf("and "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x21: pr1ntf("and "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x22: pr1ntf("and "); r___( 8); pr1ntf(", "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x23: pr1ntf("and "); r___(rr); pr1ntf(", "); ref=r_m_(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x28: pr1ntf("sub "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x29: pr1ntf("sub "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x2A: pr1ntf("sub "); r___( 8); pr1ntf(", "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x2B: pr1ntf("sub "); r___(rr); pr1ntf(", "); ref=r_m_(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x30: pr1ntf("xor "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x31: pr1ntf("xor "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x32: pr1ntf("xor "); r___( 8); pr1ntf(", "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x33: pr1ntf("xor "); r___(rr); pr1ntf(", "); ref=r_m_(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x38: pr1ntf("cmp "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x39: pr1ntf("cmp "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x3A: pr1ntf("cmp "); r___( 8); pr1ntf(", "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x3B: pr1ntf("cmp "); r___(rr); pr1ntf(", "); ref=r_m_(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x62: pr1ntf("bound "); r___(rr); pr1ntf(", "); ref=m32_32(); printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x63: pr1ntf("arpl "); ref=r_m_(16); pr1ntf(", "); r___(16); printCol+=7;
if (isGoodAddress(ref)) lclass=516;
break;
case 0x84: pr1ntf("test "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=7;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x85: pr1ntf("test "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=7;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x86: pr1ntf("xchg "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=7;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x87: pr1ntf("xchg "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=7;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x88: pr1ntf("mov "); ref=r_m_( 8); pr1ntf(", "); r___( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x89: pr1ntf("mov "); ref=r_m_(rr); pr1ntf(", "); r___(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=1024;}
break;
case 0x8A: pr1ntf("mov "); r___( 8); pr1ntf(", "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x8B: pr1ntf("mov "); r___(rr); pr1ntf(", "); ref=r_m_(rr); printCol+=6;
reg=regTable[i_mod]; tempref[reg]=ref; temppos[reg]=cur_position;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=1024;}
break;
case 0x8C: pr1ntf("mov "); ref=r_m_(16); pr1ntf(", "); Sreg__(); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=1024;}
break;
case 0x8D: pr1ntf("lea "); r___(rr); pr1ntf(", "); ref=m_____(); printCol+=6;
reg=regTable[i_mod]; tempref[reg]=ref; temppos[reg]=cur_position;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x8E: pr1ntf("mov "); Sreg__(); pr1ntf(", "); ref=r_m_(16); printCol+=6;
if (isGoodAddress(ref)) lclass=516;
break;
case 0xC4: pr1ntf("les es:"); r___(rr); pr1ntf(", "); ref=m16_32(); printCol+=9;
if (isGoodAddress(ref)) lclass=516;
break;
case 0xC5: pr1ntf("lds ds:"); r___(rr); pr1ntf(", "); ref=m16_32(); printCol+=9;
if (isGoodAddress(ref)) lclass=516;
break;
default: fatalError=113;return -1;
}
return 0;
}
int print7case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
pr1ntf("imul "); r___(rr);
if (modTable[i_mod]<8 || regTable[i_mod]!=rmTable[i_mod])
{ pr1ntf(", "); ref=r_m_(rr); printCol+=2;}
pr1ntf(", ");
print_i_byte();
printCol+=7;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
return 0;
}
int print8case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
pr1ntf("imul "); r___(rr);
if (modTable[i_mod]<8 || regTable[i_mod]!=rmTable[i_mod])
{ pr1ntf(", "); ref=r_m_(rr); printCol+=2;}
pr1ntf(", ");
print_i_dword();
printCol+=7;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
return 0;
}
int print9case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
specifierFlag = my_ON;
switch(i_opcode)
{
case 0x8F:
if (regTable[i_mod]>0)
{
fatalError=115;
specifierFlag = my_OFF;
return -1;
}
pr1ntf("pop "); ref=r_m_(rr); printCol+=4;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xD0:
switch(regTable[i_mod])
{
case 0: pr1ntf("rol "); break;
case 1: pr1ntf("ror "); break;
case 2: pr1ntf("rcl "); break;
case 3: pr1ntf("rcr "); break;
case 4: pr1ntf("shl "); break;
case 5: pr1ntf("shr "); break;
case 7: pr1ntf("sar "); break;
default: fatalError=117;
}
ref=r_m_( 8); pr1ntf(", 1"); printCol+=7;
if (isGoodAddress(ref)) lclass=520;
break;
case 0xD1:
switch(regTable[i_mod])
{
case 0: pr1ntf("rol "); break;
case 1: pr1ntf("ror "); break;
case 2: pr1ntf("rcl "); break;
case 3: pr1ntf("rcr "); break;
case 4: pr1ntf("shl "); break;
case 5: pr1ntf("shr "); break;
case 7: pr1ntf("sar "); break;
default: fatalError=118;
}
ref=r_m_(rr); pr1ntf(", 1"); printCol+=7;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xD2:
switch(regTable[i_mod])
{
case 0: pr1ntf("rol "); break;
case 1: pr1ntf("ror "); break;
case 2: pr1ntf("rcl "); break;
case 3: pr1ntf("rcr "); break;
case 4: pr1ntf("shl "); break;
case 5: pr1ntf("shr "); break;
case 7: pr1ntf("sar "); break;
default: fatalError=119;
}
ref=r_m_( 8); pr1ntf(", cl"); printCol+=8;
if (isGoodAddress(ref)) lclass=520;
break;
case 0xD3:
switch(regTable[i_mod])
{
case 0: pr1ntf("rol "); break;
case 1: pr1ntf("ror "); break;
case 2: pr1ntf("rcl "); break;
case 3: pr1ntf("rcr "); break;
case 4: pr1ntf("shl "); break;
case 5: pr1ntf("shr "); break;
case 7: pr1ntf("sar "); break;
default: fatalError=121;
}
ref=r_m_(rr); pr1ntf(", cl"); printCol+=8;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xFE:
switch(regTable[i_mod])
{
case 0: pr1ntf("inc "); ref=r_m_( 8); printCol+=4; break;
case 1: pr1ntf("dec "); ref=r_m_( 8); printCol+=4; break;
default: fatalError=123;
}
if (isGoodAddress(ref)) lclass=520;
break;
default: fatalError=125;
}
specifierFlag=my_OFF;
return 0;
}
int print10case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
switch(i_opcode)
{
case 0x80:
switch(regTable[i_mod])
{
case 0: pr1ntf("add "); printCol+=6; break;
case 1: pr1ntf("or "); printCol+=5; break;
case 2: pr1ntf("adc "); printCol+=6; break;
case 3: pr1ntf("sbb "); printCol+=6; break;
case 4: pr1ntf("and "); printCol+=6; break;
case 5: pr1ntf("sub "); printCol+=6; break;
case 6: pr1ntf("xor "); printCol+=6; break;
case 7: pr1ntf("cmp "); printCol+=6; break;
default: fatalError=127;
}
ref=r_m_( 8); pr1ntf(", "); print_i_byte();
if (isGoodAddress(ref)) lclass=520;
break;
case 0x83:
switch(regTable[i_mod])
{
case 0: pr1ntf("add "); printCol+=6; break;
case 1: pr1ntf("or "); printCol+=5; break;
case 2: pr1ntf("adc "); printCol+=6; break;
case 3: pr1ntf("sbb "); printCol+=6; break;
case 4: pr1ntf("and "); printCol+=6; break;
case 5: pr1ntf("sub "); printCol+=6; break;
case 6: pr1ntf("xor "); printCol+=6; break;
case 7: pr1ntf("cmp "); printCol+=6; break;
default: fatalError=129;
}
ref=r_m_(rr); pr1ntf(", "); print_i_byte32();
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xC0:
switch(regTable[i_mod])
{
case 0: pr1ntf("rol "); break;
case 1: pr1ntf("ror "); break;
case 2: pr1ntf("rcl "); break;
case 3: pr1ntf("rcr "); break;
case 4: pr1ntf("shl "); break;
case 5: pr1ntf("shr "); break;
case 7: pr1ntf("sar "); break;
default: fatalError=131;
}
ref=r_m_( 8); pr1ntf(", "); printCol+=6; print_i_byte();
if (isGoodAddress(ref)) lclass=520;
break;
case 0xC1:
switch(regTable[i_mod])
{
case 0: pr1ntf("rol "); break;
case 1: pr1ntf("ror "); break;
case 2: pr1ntf("rcl "); break;
case 3: pr1ntf("rcr "); break;
case 4: pr1ntf("shl "); break;
case 5: pr1ntf("shr "); break;
case 7: pr1ntf("sar "); break;
default: fatalError=133;
}
ref=r_m_(rr); pr1ntf(", "); printCol+=6; print_i_byte();
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xC6:
if (regTable[i_mod]==0)
{
pr1ntf("mov "); ref=r_m_( 8);
pr1ntf(", "); print_i_byte(); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
}
else fatalError=135;
break;
default: fatalError=137;
}
return 0;
}
int print11case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
if (i_opcode==0xC7)
{
if (regTable[i_mod]>0)
{
fatalError=139;
return -1;
}
pr1ntf("mov "); dref=r_m_(rr); pr1ntf(", ");
ref=print_i_dword();
{if (operandOveride) lclass=516; else lclass=514;}
if (nextMode>0)
{
if (isGoodAddress(dref)) EnterLabel(lclass,dref,cur_position);
lclass=1024;
}
printCol+=6;
return 0;
}
else /* is should be 0x81 otherwise i*am*in*big*trouble */
{
switch(regTable[i_mod])
{
case 0: pr1ntf("add "); printCol+=6; break;
case 1: pr1ntf("or "); printCol+=5; break;
case 2: pr1ntf("adc "); printCol+=6; break;
case 3: pr1ntf("sbb "); printCol+=6; break;
case 4: pr1ntf("and "); printCol+=6; break;
case 5: pr1ntf("sub "); printCol+=6; break;
case 6: pr1ntf("xor "); printCol+=6; break;
case 7: pr1ntf("cmp "); printCol+=6; break;
default: fatalError=141;
}
ref=r_m_(rr); pr1ntf(", "); print_i_dword();
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
}
return 0;
}
int print12case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
switch(i_opcode)
{
case 0xD8:
if (i_mod<0xC0)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("fadd "); printCol+=5; break;
case 1: pr1ntf("fmul "); printCol+=5; break;
case 2: pr1ntf("fcom "); printCol+=5; break;
case 3: pr1ntf("fcomp "); printCol+=6; break;
case 4: pr1ntf("fsub "); printCol+=5; break;
case 5: pr1ntf("fsubr "); printCol+=6; break;
case 6: pr1ntf("fdiv "); printCol+=5; break;
case 7: pr1ntf("fdivr "); printCol+=6; break;
default: fatalError=143;
}
pr1ntf("32real"); ref=r_m_( 0); printCol+=6;
if (isGoodAddress(ref)) lclass=524;
}
else
{
if (i_mod<0xC8) {pr2ntf("fadd st(0), st(%1d)", i_mod-0xC0);printCol+=17;}
else if (i_mod <0xD0){pr2ntf("fmul st(0), st(%1d)", i_mod-0xC8);printCol+=17;}
else if (i_mod==0xD1){pr1ntf("fcom") ;printCol+=4; }
else if (i_mod <0xD8){pr2ntf("fcom st(0), st(%1d)", i_mod-0xD0);printCol+=17;}
else if (i_mod==0xD9){pr1ntf("fcomp") ;printCol+=5; }
else if (i_mod <0xE0){pr2ntf("fcomp st(0), st(%1d)", i_mod-0xD8);printCol+=18;}
else if (i_mod <0xE8){pr2ntf("fsub st(0), st(%1d)", i_mod-0xE0);printCol+=17;}
else if (i_mod <0xF0){pr2ntf("fsubr st(0), st(%1d)", i_mod-0xE8);printCol+=18;}
else if (i_mod <0xF8){pr2ntf("fdiv st(0), st(%1d)", i_mod-0xF0);printCol+=17;}
else {pr2ntf("fdivr st(0), st(%1d)", i_mod-0xF8);printCol+=18;}
}
break;
case 0xD9:
if (i_mod<0xC0)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("fld "); pr1ntf("32real"); ref=r_m_( 0);
printCol+=10; if (isGoodAddress(ref)) lclass=524;
break;
case 2: pr1ntf("fst "); pr1ntf("32real"); ref=r_m_( 0);
printCol+=10; if (isGoodAddress(ref)) lclass=524;
break;
case 3: pr1ntf("fstp "); pr1ntf("32real"); ref=r_m_( 0);
printCol+=11; if (isGoodAddress(ref)) lclass=524;
break;
case 4: pr1ntf("fldenv ");pr1ntf("14/28byte"); ref=r_m_( 0);
printCol+=16; if (isGoodAddress(ref)) lclass=515;
break;
case 5: pr1ntf("fldcw "); pr1ntf("2byte"); ref=r_m_( 0);
printCol+=11; if (isGoodAddress(ref)) lclass=516;
break;
case 6: pr1ntf("fnstenv ");pr1ntf("14/28byte");ref=r_m_( 0);
printCol+=17; if (isGoodAddress(ref)) lclass=515;
break;
case 7: pr1ntf("fnstcw ");pr1ntf("2byte"); ref=r_m_( 0);
printCol+=12; if (isGoodAddress(ref)) lclass=516;
break;
default: fatalError=145;
}
}
else
{
if (i_mod<0xC8) {pr2ntf("fld st(%1d)", i_mod-0xC0) ;printCol+=9; }
else if (i_mod==0xC9){pr1ntf("fxch") ;printCol+=4; }
else if (i_mod <0xD0){pr2ntf("fxch st(%1d)", i_mod-0xC8);printCol+=10;}
else
{
switch(i_mod)
{
case 0xD0: pr1ntf("fnop"); printCol+=4; break;
case 0xE0: pr1ntf("fchs"); printCol+=4; break;
case 0xE1: pr1ntf("fabs"); printCol+=4; break;
case 0xE4: pr1ntf("ftst"); printCol+=4; break;
case 0xE5: pr1ntf("fxam"); printCol+=4; break;
case 0xE8: pr1ntf("fld1"); printCol+=4; break;
case 0xE9: pr1ntf("fldl2t"); printCol+=6; break;
case 0xEA: pr1ntf("fldl2e"); printCol+=6; break;
case 0xEB: pr1ntf("fldpi"); printCol+=5; break;
case 0xEC: pr1ntf("fldlg2"); printCol+=6; break;
case 0xED: pr1ntf("fldln2"); printCol+=6; break;
case 0xEE: pr1ntf("fldz"); printCol+=4; break;
case 0xF0: pr1ntf("f2xm1"); printCol+=5; break;
case 0xF1: pr1ntf("fyl2x"); printCol+=5; break;
case 0xF2: pr1ntf("fptan"); printCol+=5; break;
case 0xF3: pr1ntf("fpatan"); printCol+=6; break;
case 0xF4: pr1ntf("fxtract"); printCol+=7; break;
case 0xF5: pr1ntf("fprem1"); printCol+=6; break;
case 0xF6: pr1ntf("fdecstp"); printCol+=7; break;
case 0xF7: pr1ntf("fincstp"); printCol+=7; break;
case 0xF8: pr1ntf("fprem"); printCol+=5; break;
case 0xF9: pr1ntf("fyl2xp1"); printCol+=7; break;
case 0xFA: pr1ntf("fsqrt"); printCol+=5; break;
case 0xFB: pr1ntf("fsincos"); printCol+=7; break;
case 0xFC: pr1ntf("frndint"); printCol+=7; break;
case 0xFD: pr1ntf("fscale"); printCol+=6; break;
case 0xFE: pr1ntf("fsin"); printCol+=4; break;
case 0xFF: pr1ntf("fcos"); printCol+=4; break;
default: fatalError=202;
}
}
}
break;
case 0xDA:
if (i_mod<0xC0)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("fiadd "); ref=r_m_(rr); printCol+=6; break;
case 1: pr1ntf("fimul "); ref=r_m_(rr); printCol+=6; break;
case 2: pr1ntf("ficom "); ref=r_m_(rr); printCol+=6; break;
case 3: pr1ntf("ficomp "); ref=r_m_(rr); printCol+=7; break;
case 4: pr1ntf("fisub "); ref=r_m_(rr); printCol+=6; break;
case 5: pr1ntf("fisubr "); ref=r_m_(rr); printCol+=7; break;
case 6: pr1ntf("fidiv "); ref=r_m_(rr); printCol+=6; break;
case 7: pr1ntf("fidivr "); ref=r_m_(rr); printCol+=7; break;
default: fatalError=204;
}
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
}
else
{
if (i_mod<0xC8) {pr2ntf("fcmovb st(0), st(%1d)", i_mod-0xC0);printCol+=19;}
else if (i_mod <0xD0){pr2ntf("fcmove st(0), st(%1d)", i_mod-0xC8);printCol+=19;}
else if (i_mod <0xD8){pr2ntf("fcmovbe st(0), st(%1d)",i_mod-0xD0);printCol+=20;}
else if (i_mod <0xE0){pr2ntf("fcmovu st(0), st(%1d)", i_mod-0xD8);printCol+=19;}
else if (i_mod==0xE9){pr1ntf("fucompp") ;printCol+=7; }
}
break;
case 0xDB:
if (i_mod<0xC0)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("fild "); ref=r_m_(rr); printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 2: pr1ntf("fist "); ref=r_m_(rr); printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 3: pr1ntf("fistp "); ref=r_m_(rr); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 5: pr1ntf("fld "); pr1ntf("80real"); ref=r_m_( 0); printCol+=10;
if (isGoodAddress(ref)) lclass=517;
break;
case 7: pr1ntf("fstp "); pr1ntf("80real"); ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=517;
break;
default: fatalError=206;
}
}
else
{
if (i_mod<0xC8) {pr2ntf("fcmovnb st(0), st(%1d)", i_mod-0xC0);printCol+=20;}
else if (i_mod <0xD0){pr2ntf("fcmovne st(0), st(%1d)", i_mod-0xC8);printCol+=20;}
else if (i_mod <0xD8){pr2ntf("fcmovnbe st(0), st(%1d)",i_mod-0xD0);printCol+=21;}
else if (i_mod <0xE0){pr2ntf("fcmovnu st(0), st(%1d)", i_mod-0xD8);printCol+=20;}
else if (i_mod==0xE2){pr1ntf("fnclex") ;printCol+=6; }
else if (i_mod==0xE3){pr1ntf("fninit") ;printCol+=6; }
else if (i_mod <0xE8) fatalError=208;
else if (i_mod <0xF0){pr2ntf("fucomi st(0), st(%1d)", i_mod-0xE8) ;printCol+=19;}
else if (i_mod <0xF8){pr2ntf("fcomi st(0), st(%1d)", i_mod-0xF0) ;printCol+=18;}
}
break;
case 0xDC:
if (i_mod<0xC0)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("fadd "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=528;
break;
case 1: pr1ntf("fmul "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=528;
break;
case 2: pr1ntf("fcom "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=528;
break;
case 3: pr1ntf("fcomp ");pr1ntf("64real"); ref=r_m_( 0); printCol+=12;
if (isGoodAddress(ref)) lclass=528;
break;
case 4: pr1ntf("fsub "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=528;
break;
case 5: pr1ntf("fsubr ");pr1ntf("64real"); ref=r_m_( 0); printCol+=12;
if (isGoodAddress(ref)) lclass=528;
break;
case 6: pr1ntf("fdiv "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=528;
break;
case 7: pr1ntf("fdivr ");pr1ntf("64real"); ref=r_m_( 0); printCol+=12;
if (isGoodAddress(ref)) lclass=528;
break;
default: fatalError=210;
}
}
else
{
if (i_mod<0xC8) {pr2ntf("fadd st(0), st(%1d)", i_mod-0xC0);printCol+=17;}
else if (i_mod <0xD0){pr2ntf("fmul st(0), st(%1d)", i_mod-0xC8);printCol+=17;}
else if (i_mod <0xE0) fatalError=212;
else if (i_mod <0xE8){pr2ntf("fsub st(0), st(%1d)",i_mod-0xE0);printCol+=18;}
else if (i_mod <0xF0){pr2ntf("fsubr st(0), st(%1d)", i_mod-0xD8);printCol+=17;}
else if (i_mod <0xF8){pr2ntf("fdiv st(0), st(%1d)",i_mod-0xF0);printCol+=18;}
else {pr2ntf("fdivr st(0), st(%1d)", i_mod-0xF8);printCol+=17;}
}
break;
case 0xDD:
if (i_mod<0xC0)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("fld "); pr1ntf("64real"); ref=r_m_( 0); printCol+=10;
if (isGoodAddress(ref)) lclass=528;
break;
case 2: pr1ntf("fst "); pr1ntf("64real"); ref=r_m_( 0); printCol+=10;
if (isGoodAddress(ref)) lclass=528;
break;
case 3: pr1ntf("fstp "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=528;
break;
case 4: pr1ntf("frstor ");pr1ntf("94/108byte");ref=r_m_( 0);printCol+=17;
if (isGoodAddress(ref)) lclass=519;
break;
case 6: pr1ntf("fnsave ");pr1ntf("94/108byte");ref=r_m_( 0);printCol+=17;
if (isGoodAddress(ref)) lclass=519;
break;
case 7: pr1ntf("fnstsw ");pr1ntf("2byte"); ref=r_m_( 0); printCol+=12;
if (isGoodAddress(ref)) lclass=516;
break;
default: fatalError=214;
}
}
else
{
if (i_mod<0xC8) {pr2ntf("ffree st(%1d)", i_mod-0xC0);printCol+=11;}
else if (i_mod <0xD0) fatalError=216;
else if (i_mod <0xD8){pr2ntf("fst st(%1d)", i_mod-0xD0);printCol+=9; }
else if (i_mod <0xE0){pr2ntf("fstp st(%1d)", i_mod-0xD8);printCol+=10;}
else if (i_mod==0xE1){pr1ntf("fucom") ;printCol+=5; }
else if (i_mod <0xE8){pr2ntf("fucom st(%1d)", i_mod-0xE0);printCol+=11;}
else if (i_mod==0xE9){pr1ntf("fucomp") ;printCol+=6; }
else if (i_mod <0xF0){pr2ntf("fucomp st(%1d)",i_mod-0xE8);printCol+=12;}
else fatalError=218;
}
break;
case 0xDE:
if (i_mod<0xC0)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("fiadd "); pr1ntf("16int");ref=r_m_( 0); printCol+=6;
if (isGoodAddress(ref)) lclass=516;
break;
case 1: pr1ntf("fimul "); pr1ntf("16int");ref=r_m_( 0); printCol+=6;
if (isGoodAddress(ref)) lclass=516;
break;
case 2: pr1ntf("ficom "); pr1ntf("16int");ref=r_m_( 0); printCol+=6;
if (isGoodAddress(ref)) lclass=516;
break;
case 3: pr1ntf("ficomp "); pr1ntf("16int");ref=r_m_( 0); printCol+=7;
if (isGoodAddress(ref)) lclass=516;
break;
case 4: pr1ntf("fisub "); pr1ntf("16int");ref=r_m_( 0); printCol+=6;
if (isGoodAddress(ref)) lclass=516;
break;
case 5: pr1ntf("fisubr "); pr1ntf("16int");ref=r_m_( 0); printCol+=7;
if (isGoodAddress(ref)) lclass=516;
break;
case 6: pr1ntf("fidiv "); pr1ntf("16int");ref=r_m_( 0); printCol+=6;
if (isGoodAddress(ref)) lclass=516;
break;
case 7: pr1ntf("fidivr "); pr1ntf("16int");ref=r_m_( 0); printCol+=7;
if (isGoodAddress(ref)) lclass=516;
break;
default: fatalError=220;
}
}
else
{
if(i_mod==0xC1) {pr1ntf("faddp") ;printCol+=5; }
else if (i_mod <0xC8){pr2ntf("faddp st(%1d), st(0)", i_mod-0xC0) ;printCol+=18;}
else if (i_mod==0xC9){pr1ntf("fmulp") ;printCol+=5; }
else if (i_mod <0xD0){pr2ntf("fmulp st(%1d), st(0)", i_mod-0xC8) ;printCol+=18;}
else if (i_mod==0xD9){pr1ntf("fcompp") ;printCol+=6; }
else if (i_mod <0xE0) fatalError=222;
else if (i_mod==0xE1){pr1ntf("fsubrp"); ;printCol+=6; }
else if (i_mod <0xE8){pr2ntf("fsubrp st(%1d), st(0)", i_mod-0xE0);printCol+=19;}
else if (i_mod==0xE9){pr1ntf("fsubp") ;printCol+=5; }
else if (i_mod <0xF0){pr2ntf("fsubp st(%1d), st(0)", i_mod-0xE8) ;printCol+=18;}
else if (i_mod==0xF1){pr1ntf("fdivrp") ;printCol+=6; }
else if (i_mod <0xF8){pr2ntf("fdivrp st(%1d), st(0)", i_mod-0xF0);printCol+=18;}
else if (i_mod==0xF9){pr1ntf("fdivp") ;printCol+=5; }
else {pr2ntf("fdivp st(%1d), st(0)", i_mod-0xF8) ;printCol+=18;}
}
break;
case 0xDF:
if (i_mod<0xC0)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("fild "); pr1ntf("16int");ref=r_m_( 0); printCol+=10;
if (isGoodAddress(ref)) lclass=516;
break;
case 2: pr1ntf("fist "); pr1ntf("16int");ref=r_m_( 0); printCol+=10;
if (isGoodAddress(ref)) lclass=516;
break;
case 3: pr1ntf("fistp "); pr1ntf("16int");ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=516;
break;
case 4: pr1ntf("fbld "); pr1ntf("80bcd");ref=r_m_( 0); printCol+=10;
if (isGoodAddress(ref)) lclass=517;
break;
case 5: pr1ntf("fild "); pr1ntf("64int");ref=r_m_( 0); printCol+=10;
if (isGoodAddress(ref)) lclass=528;
break;
case 6: pr1ntf("fbstp "); pr1ntf("80bcd");ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=517;
break;
case 7: pr1ntf("fistp "); pr1ntf("64int");ref=r_m_( 0); printCol+=11;
if (isGoodAddress(ref)) lclass=528;
break;
default: fatalError=224;
}
}
else
{
if(i_mod <0xDF) fatalError=226;
else if (i_mod==0xE0){pr1ntf("fnstsw ax") ;printCol+=9; }
else if (i_mod <0xE8) fatalError=228;
else if (i_mod <0xF0){pr2ntf("fucomip st(0), st(%1d)", i_mod-0xE8);printCol+=20;}
else if (i_mod <0xF8){pr2ntf("fcomip st(0), st(%1d)", i_mod-0xF0) ;printCol+=19;}
else fatalError=230;
}
break;
default: fatalError=232;
}
return 0;
} /* print12case() */
int print13case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
switch(regTable[i_mod])
{
case 0: pr1ntf("inc "); ref=r_m_(rr); printCol+=4;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 1: pr1ntf("dec "); ref=r_m_(rr); printCol+=4;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 2: pr1ntf("call "); printCol+=4;
ref = r_m_(rr);
lclass=13;
if (nextMode)
{
if (i_mod>=0xD0)
{
reg=rmTable[i_mod];
if (temppos[reg]+128>cur_position)
ref=tempref[reg]; temppos[reg]=cur_position;
}
}
else printName(cur_position);
break;
case 3: pr1ntf("call "); ref = m16_32(); lclass=17; printCol+=4;
break;
case 4: pr1ntf("jmp "); printCol+=4;
ref=r_m_(32);
if (gotJmpRef)
{ lclass=128+5; gotJmpRef=0; }
else lclass=5;
if (i_mod>=0xD0)
{
reg=rmTable[i_mod];
if (temppos[reg]+128>cur_position)
ref=tempref[reg]; temppos[reg]=cur_position;
}
needJump=1; needJumpNext=cur_position+i_col;
if (nextMode)
{
// it is OK to mark anchor...because it will not be erased easily??
lastAnchor=cur_position+i_col-1;
pushTrace(150);
orMap(lastAnchor, 0x80);
popTrace();
}
else printName(cur_position);
break;
case 5: pr1ntf("jmp "); ref = m16_32(); lclass = 9; printCol+=4;
needJump=1; needJumpNext=cur_position+i_col;
break;
case 6: pr1ntf("push "); ref = r_m_(rr); printCol+=5;
lclass = 513;
// well I really don't know it is reasonably safe to do this.
// I think when we push some (possible) address references into stack
// there is strong reason to do so. that's why i am doing this. i guess...
break;
default: fatalError=234;
}
return 0;
}
int print14case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
if (i_opcode==0xF6)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("test "); ref=r_m_( 8); pr1ntf(", "); print_i_byte(); printCol+=7;
if (isGoodAddress(ref)) lclass=520;
break;
case 2: pr1ntf("not "); ref=r_m_( 8); printCol+=4;
if (isGoodAddress(ref)) lclass=520;
break;
case 3: pr1ntf("neg "); ref=r_m_( 8); printCol+=4;
if (isGoodAddress(ref)) lclass=520;
break;
case 4: pr1ntf("mul "); ref=r_m_( 8); printCol+=4;
if (isGoodAddress(ref)) lclass=520;
break;
case 5: pr1ntf("imul "); ref=r_m_( 8); printCol+=4;
if (isGoodAddress(ref)) lclass=520;
break;
case 6: pr1ntf("div "); ref=r_m_( 8); printCol+=4;
if (isGoodAddress(ref)) lclass=520;
break;
case 7: pr1ntf("idiv "); ref=r_m_( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
default: fatalError=303;
}
}
else if (i_opcode==0xF7)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("test "); ref=r_m_(rr); pr1ntf(", "); print_i_dword(); printCol+=7;
break;
case 2: pr1ntf("not "); ref=r_m_(rr); printCol+=4;
break;
case 3: pr1ntf("neg "); ref=r_m_(rr); printCol+=4;
break;
case 4: pr1ntf("mul "); ref=r_m_(rr); printCol+=4;
break;
case 5: pr1ntf("imul "); ref=r_m_(rr); printCol+=5;
break;
case 6: pr1ntf("div "); ref=r_m_(rr); printCol+=4;
break;
case 7: pr1ntf("idiv "); ref=r_m_(rr); printCol+=5;
break;
default: fatalError=305;
}
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
}
else fatalError=307;
return 0;
}
int print15case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
if (i_opcode==0xD9)
{
if (regTable[i_mod]==6)
{
pr1ntf("fstenv 14/28byte"); ref=r_m_(rr); printCol+=16;
if (isGoodAddress(ref)) lclass=515;
}
else if (regTable[i_mod]==7)
{
pr1ntf("fstcw 2byte"); ref=r_m_(rr); printCol+=11;
if (isGoodAddress(ref)) lclass=516;
}
else fatalError=309;
}
else if (i_opcode==0xDB)
{
if (i_mod==0xE2) {pr1ntf("fclex ");}
else if (i_mod==0xE3) {pr1ntf("finit ");}
else fatalError=311; printCol+=6;
}
else if (i_opcode==0xDD)
{
if (regTable[i_mod]==6)
{
pr1ntf("fsave 94/108byte"); ref=r_m_(rr); printCol+=16;
if (isGoodAddress(ref)) lclass=519;
}
else if (regTable[i_mod]==7)
{
pr1ntf("fstsw 2byte"); ref=r_m_(rr); printCol+=11;
if (isGoodAddress(ref)) lclass=516;
}
else fatalError=313;
}
else if (i_opcode==0xDF)
{
if (i_mod==0xE0) {pr1ntf("fstsw ax ");}
else fatalError=315; printCol+=9;
}
else if (i_opcode==0x9B) {pr1ntf("wait"); printCol+=4;}
else fatalError=317;
return 0;
}
int print16case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
if (prefixStack[i_psp-1]==0xF2)
{
switch(i_opcode)
{
case 0xA6: pr1ntf("repne cmpsb"); printCol+=11; break;
case 0xA7: if (operandOveride) {pr1ntf("repne cmpsw");}
else {pr1ntf("repne cmpsd");} printCol+=11; break;
case 0xAE: pr1ntf("repne scasb"); printCol+=11; break;
case 0xAF: if (operandOveride) {pr1ntf("repne scasw");}
else {pr1ntf("repne scasd");} printCol+=11; break;
default: fatalError=319;
}
}
else if (prefixStack[i_psp-1]==0xF3)
{
switch(i_opcode)
{
case 0x6C: pr1ntf("rep ins byte");
ref=r_m_( 8);pr1ntf(", port[dx]"); printCol+=22;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x6D: if (operandOveride){pr1ntf("rep ins word") ;printCol+=12;}
else {pr1ntf("rep ins dword");printCol+=13;}
ref=r_m_(rr);pr1ntf(", port[dx]"); printCol+=10;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x6E: pr1ntf("rep outs port[dx], byte"); printCol+=23;
ref=r_m_( 8);
if (isGoodAddress(ref)) lclass=520;
break;
case 0x6F: if (operandOveride){pr1ntf("rep outs port[dx], word");printCol+=23;}
else{pr1ntf("rep outs port[dx], dword") ;printCol+=24;}
r_m_(rr);
break;
case 0xA4: pr1ntf("rep movsb"); printCol+=9;
break;
case 0xA5: if (operandOveride) {pr1ntf("rep movsw");}
else {pr1ntf("rep movsd");} printCol+=9;
break;
case 0xA6: pr1ntf("repe cmpsb"); printCol+=10;
break;
case 0xA7: if (operandOveride) {pr1ntf("repe cmpsw");}
else {pr1ntf("repe cmpsd");} printCol+=10;
break;
case 0xAA: pr1ntf("rep stosb"); printCol+=9;
break;
case 0xAB: if (operandOveride) {pr1ntf("rep stosw");}
else {pr1ntf("rep stosd");} printCol+=9;
break;
case 0xAC: pr1ntf("rep lods al"); printCol+=11;
break;
case 0xAD: if (operandOveride){pr1ntf("rep lods ax") ;printCol+=11;}
else {pr1ntf("rep lods eax");printCol+=12;}
break;
case 0xAE: pr1ntf("repe scasb"); printCol+=10;
break;
case 0xAF: if (operandOveride) {pr1ntf("repe scasw");}
else {pr1ntf("repe scasd");} printCol+=10;
break;
default: fatalError=321;
}
}
else fatalError=323;
return 0;
}
/* *************************************************************** */
/* *************************************************************** */
/* 2 byte opcode printing starts here! */
/* *************************************************************** */
/* *************************************************************** */
int print20case()
{
switch(i_opcode)
{
case 0x06: pr1ntf("clts"); printCol+=4; break;
case 0x08: pr1ntf("invd"); printCol+=4; break;
case 0x09: pr1ntf("wbinvd"); printCol+=6; break;
case 0x0B: pr1ntf("ud2"); printCol+=3; break;
case 0x30: pr1ntf("wrmsr"); printCol+=5; break;
case 0x31: pr1ntf("rdtsc"); printCol+=5; break;
case 0x32: pr1ntf("rdmsr"); printCol+=5; break;
case 0x33: pr1ntf("rdpmc"); printCol+=5; break;
case 0x34: pr1ntf("sysenter"); printCol+=8; break;
case 0x35: pr1ntf("sysexit"); printCol+=7; break;
case 0x77: pr1ntf("emms"); printCol+=4; break;
case 0xA0: pr1ntf("push fs"); printCol+=7; break;
case 0xA1: pr1ntf("pop fs"); printCol+=6; break;
case 0xA2: pr1ntf("cpuid"); printCol+=5; break;
case 0xA8: pr1ntf("push gs"); printCol+=7; break;
case 0xA9: pr1ntf("pop gs"); printCol+=6; break;
case 0xAA: pr1ntf("rsm"); printCol+=3; break;
case 0xC8: pr1ntf("bswap eax"); printCol+=9; break;
case 0xC9: pr1ntf("bswap ecx"); printCol+=9; break;
case 0xCA: pr1ntf("bswap edx"); printCol+=9; break;
case 0xCB: pr1ntf("bswap ebx"); printCol+=9; break;
case 0xCC: pr1ntf("bswap esp"); printCol+=9; break;
case 0xCD: pr1ntf("bswap ebp"); printCol+=9; break;
case 0xCE: pr1ntf("bswap esi"); printCol+=9; break;
case 0xCF: pr1ntf("bswap edi"); printCol+=9; break;
default: fatalError=325;
}
return 0;
}
int print21case()
{
switch(i_opcode)
{
case 0x80: pr1ntf("jo "); printCol+=3; break;
case 0x81: pr1ntf("jno "); printCol+=4; break;
case 0x82: pr1ntf("jb "); printCol+=3; break;
case 0x83: pr1ntf("jae "); printCol+=4; break;
case 0x84: pr1ntf("je "); printCol+=3; break;
case 0x85: pr1ntf("jne "); printCol+=4; break;
case 0x86: pr1ntf("jbe "); printCol+=4; break;
case 0x87: pr1ntf("ja "); printCol+=3; break;
case 0x88: pr1ntf("js "); printCol+=3; break;
case 0x89: pr1ntf("jns "); printCol+=4; break;
case 0x8A: pr1ntf("jpe "); printCol+=4; break;
case 0x8B: pr1ntf("jpo "); printCol+=4; break;
case 0x8C: pr1ntf("jl "); printCol+=3; break;
case 0x8D: pr1ntf("jge "); printCol+=4; break;
case 0x8E: pr1ntf("jle "); printCol+=4; break;
case 0x8F: pr1ntf("jg "); printCol+=3; break;
default: fatalError=327;
}
ref = print_rel32(); lclass = 4;
return 0;
}
int print22case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
switch(i_opcode)
{
case 0x02: pr1ntf("lar "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x03: pr1ntf("lsl "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x20: pr1ntf("mov "); r_m_(rr);pr2ntf(", cr%1d", regTable[i_mod]);printCol+=9;
break;
case 0x21: pr1ntf("mov "); r_m_(rr);pr2ntf(", dr%1d", regTable[i_mod]);printCol+=9;
break;
case 0x22: pr2ntf("mov cr%1d, ",regTable[i_mod]); r_m_(rr);printCol+=9;
break;
case 0x23: pr2ntf("mov dr%1d, ",regTable[i_mod]); r_m_(rr);printCol+=9;
break;
case 0x40: pr1ntf("cmovo "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x41: pr1ntf("cmovno "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x42: pr1ntf("cmovb "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x43: pr1ntf("cmovae "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x44: pr1ntf("cmove "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x45: pr1ntf("cmovne "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x46: pr1ntf("cmovbe "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x47: pr1ntf("cmova "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x48: pr1ntf("cmovs "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x49: pr1ntf("cmovns "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x4A: pr1ntf("cmovpe "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x4B: pr1ntf("cmovpo "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x4C: pr1ntf("cmovl "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x4D: pr1ntf("cmovge "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x4E: pr1ntf("cmovle "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x4F: pr1ntf("cmovg "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x60: pr1ntf("punpcklbw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x61: pr1ntf("punpcklwd "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x62: pr1ntf("punpckldq "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x63: pr1ntf("packsswb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=11;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x64: pr1ntf("pcmpgtb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x65: pr1ntf("pcmpgtw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x66: pr1ntf("pcmpgtd "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x67: pr1ntf("packuswb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=11;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x68: pr1ntf("punpckhbw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x69: pr1ntf("punpckhwd "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x6A: pr1ntf("punpckhdq "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x6B: pr1ntf("packssdw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=11;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x6E: pr1ntf("movd "); mm____();pr1ntf(", ");ref=r_m_(rr);printCol+=7;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0x6F: pr1ntf("movq "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=7;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x74: pr1ntf("pcmpeqb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x75: pr1ntf("pcmpeqw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x76: pr1ntf("pcmpeqd "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x7E: pr1ntf("movd "); r_m_(rr);pr1ntf(", ");ref=mm____();printCol+=7;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x7F: pr1ntf("movq "); r_m_(64);pr1ntf(", ");ref=mm____();printCol+=7;
if (isGoodAddress(ref)) lclass=518;
break;
case 0x90: pr1ntf("seto "); ref=r_m_( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x91: pr1ntf("setno "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x92: pr1ntf("setb "); ref=r_m_( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x93: pr1ntf("setae "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x94: pr1ntf("sete "); ref=r_m_( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x95: pr1ntf("setne "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x96: pr1ntf("setbe "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x97: pr1ntf("seta "); ref=r_m_( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x98: pr1ntf("sets "); ref=r_m_( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x99: pr1ntf("setns "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x9A: pr1ntf("setpe "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x9B: pr1ntf("setpo "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x9C: pr1ntf("setl "); ref=r_m_( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x9D: pr1ntf("setge "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x9E: pr1ntf("setle "); ref=r_m_( 8); printCol+=6;
if (isGoodAddress(ref)) lclass=520;
break;
case 0x9F: pr1ntf("setg "); ref=r_m_( 8); printCol+=5;
if (isGoodAddress(ref)) lclass=520;
break;
case 0xA3: pr1ntf("bt "); ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xA5: pr1ntf("shld "); ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=11;
pr1ntf(", cl");
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xAB: pr1ntf("bts "); ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xAD: pr1ntf("shrd "); ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=11;
pr1ntf(", cl");
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xAF: pr1ntf("imul "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=7;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xB0: pr1ntf("cmpxchg "); ref=r_m_( 8);pr1ntf(", ");r___( 8);printCol+=10;
if (isGoodAddress(ref)) lclass=520;
break;
case 0xB1: pr1ntf("cmpxchg "); ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=10;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xB2: pr1ntf("lss "); r___(rr);pr1ntf(", ");ref=m16_32();printCol+=6;
if (isGoodAddress(ref)) lclass=516;
break;
case 0xB3: pr1ntf("btr "); ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xB4: pr1ntf("lfs "); r___(rr);pr1ntf(", ");ref=m16_32();printCol+=6;
if (isGoodAddress(ref)) lclass=516;
break;
case 0xB5: pr1ntf("lgs "); r___(rr);pr1ntf(", ");ref=m16_32();printCol+=6;
if (isGoodAddress(ref)) lclass=516;
break;
case 0xB6: pr1ntf("movzx "); r___(rr);pr1ntf(", ");ref=r_m_( 8);printCol+=8;
if (isGoodAddress(ref)) lclass=520;
break;
case 0xB7: pr1ntf("movzx "); r___(rr);pr1ntf(", ");ref=r_m_(16);printCol+=8;
if (isGoodAddress(ref)) lclass=516;
break;
case 0xBB: pr1ntf("btc "); ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xBC: pr1ntf("bsf "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xBD: pr1ntf("bsr "); r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xBE: pr1ntf("movsx "); r___(rr);pr1ntf(", ");ref=r_m_( 8);printCol+=8;
if (isGoodAddress(ref)) lclass=520;
break;
case 0xBF: pr1ntf("movsx "); r___(rr);pr1ntf(", ");ref=r_m_(16);printCol+=8;
if (isGoodAddress(ref)) lclass=516;
break;
case 0xC0: pr1ntf("xadd "); ref=r_m_( 8);pr1ntf(", ");r___( 8);printCol+=7;
if (isGoodAddress(ref)) lclass=520;
break;
case 0xC1: pr1ntf("xadd "); ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=7;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 0xD1: pr1ntf("psrlw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xD2: pr1ntf("psrld "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xD3: pr1ntf("psrlq "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xD5: pr1ntf("pmullw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xD8: pr1ntf("psubusb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xD9: pr1ntf("psubusw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xDB: pr1ntf("pand "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=7;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xDC: pr1ntf("paddusb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xDD: pr1ntf("paddusw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xDF: pr1ntf("pandn "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xE1: pr1ntf("psraw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xE2: pr1ntf("psrad "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xE5: pr1ntf("pmulhw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xE8: pr1ntf("psubsb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xE9: pr1ntf("psubsw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xEB: pr1ntf("por "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=5;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xEC: pr1ntf("paddsb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xED: pr1ntf("paddsw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xEF: pr1ntf("pxor "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=7;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xF1: pr1ntf("psllw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xF2: pr1ntf("pslld "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xF3: pr1ntf("psllq "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xF5: pr1ntf("pmaddwd "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xF8: pr1ntf("psubb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xF9: pr1ntf("psubw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xFA: pr1ntf("psubd "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xFC: pr1ntf("paddb "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xFD: pr1ntf("paddw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
case 0xFE: pr1ntf("paddd "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
if (isGoodAddress(ref)) lclass=518;
break;
default: fatalError=329;
}
return 0;
}
int print23case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
if (i_opcode==0xA4)
{
pr1ntf("shld "); r_m_(rr);
pr1ntf(", "); r___(rr);
pr1ntf(", "); print_i_byte(); printCol+=9;
}
else
{
pr1ntf("shrd "); r_m_(rr);
pr1ntf(", "); r___(rr);
pr1ntf(", "); print_i_byte(); printCol+=9;
}
return 0;
}
int print24case()
{
int rr;
if (operandOveride) rr=16; else rr=32;
if (i_opcode==0x00)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("sldt "); ref=r_m_(rr); printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 1: pr1ntf("str "); ref=r_m_(16); printCol+=4;
if (isGoodAddress(ref)) lclass=516;
break;
case 2: pr1ntf("lldt "); ref=r_m_(16); printCol+=5;
if (isGoodAddress(ref)) lclass=516;
break;
case 3: pr1ntf("ltr "); ref=r_m_(16); printCol+=4;
if (isGoodAddress(ref)) lclass=516;
break;
case 4: pr1ntf("verr "); ref=r_m_(16); printCol+=5;
if (isGoodAddress(ref)) lclass=516;
break;
case 5: pr1ntf("verw "); ref=r_m_(16); printCol+=5;
if (isGoodAddress(ref)) lclass=516;
break;
default: fatalError=331;
}
}
else if (i_opcode==0x01)
{
switch(regTable[i_mod])
{
case 0: pr1ntf("sgdt "); ref=m_____(); printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 1: pr1ntf("sidt "); ref=m_____(); printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 2: pr1ntf("lgdt "); ref=m16_32(); printCol+=5;
if (isGoodAddress(ref)) lclass=516;
break;
case 3: pr1ntf("lidt "); ref=m16_32(); printCol+=5;
if (isGoodAddress(ref)) lclass=516;
break;
case 4: pr1ntf("smsw "); ref=r_m_(rr); printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
case 6: pr1ntf("lmsw "); ref=r_m_(16); printCol+=5;
if (isGoodAddress(ref)) lclass=516;
break;
case 7: pr1ntf("invlpg "); ref=m_____(); printCol+=7;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
break;
default: fatalError=333;
}
}
else if (i_opcode==0xAE)
{
if (regTable[i_mod]==0) {pr1ntf("fxsave") ;printCol+=6;}
else if (regTable[i_mod]==1) {pr1ntf("fxrstor");printCol+=7;}
else fatalError=334;
}
else if (i_opcode==0xC7 && regTable[i_mod]==1)
{
pr1ntf("cmpxchg8b 64bit"); printCol+=15;
m_____();
}
else fatalError=335;
return 0;
}
int print25case()
{
int k;
int rr;
if (operandOveride) rr=16; else rr=32;
k = regTable[i_mod];
if (i_opcode==0x71)
{
if (k==2)
{
pr1ntf("psrlw "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8;
}
else if (k==4)
{
pr1ntf("psraw "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8;
}
else if (k==6)
{
pr1ntf("psllw "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8;
}
else fatalError=337;
}
else if (i_opcode==0x72)
{
if (k==2)
{
pr1ntf("psrld "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8;
}
else if (k==4)
{
pr1ntf("psrad "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8;
}
else if (k==6)
{
pr1ntf("pslld "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8;
}
else fatalError=339;
}
else if (i_opcode==0x73)
{
if (k==2)
{
pr1ntf("psrlq "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8;
}
else if (k==6)
{
pr1ntf("psllq "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8;
}
else fatalError=341;
}
else if (i_opcode==0xBA)
{
if (k==4)
{
pr1ntf("bt "); ref=r_m_(rr); pr1ntf(", "); print_i_byte32(); printCol+=5;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
}
else if (k==5)
{
pr1ntf("bts "); ref=r_m_(rr); pr1ntf(", "); print_i_byte32(); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
}
else if (k==6)
{
pr1ntf("btr "); ref=r_m_(rr); pr1ntf(", "); print_i_byte32(); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
}
else if (k==7)
{
pr1ntf("btc "); ref=r_m_(rr); pr1ntf(", "); print_i_byte32(); printCol+=6;
if (isGoodAddress(ref))
{if (operandOveride) lclass=516; else lclass=514;}
}
else fatalError=343;
}
else fatalError=345;
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1