// // // 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 (01) 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;i0) EnterLabel(166, m_dword, cur_position); else { for(i=i_col;i=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-1) {if(j++==16) {pr1ntf("\n ");j=1;}pr2ntf("%02X ",stringBuf[i++]);} for(i=j;i0); else { for(i=i_col;ic_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)peNameBuffclass, 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)peNameBuffclass; 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(" ");} else if (*p==0x0A) { pr1ntf(" "); if (*(p+1)==0x0A) {pr1ntf(" ");} } else if (*p==0x09) { pr1ntf(" "); if (*(p+1)==0x09) {pr1ntf(" ");} } 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; }