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

📄 print1.c

📁 F:反汇编源码代码学习disasm.ZIP
💻 C
📖 第 1 页 / 共 5 页
字号:
			}
			else
			{
			    if (i_mod<0xC8)       prxntf("fcmovnb st(0), st(%1d)", i_mod-0xC0);
				else if (i_mod <0xD0) prxntf("fcmovne st(0), st(%1d)", i_mod-0xC8);
				else if (i_mod <0xD8) prxntf("fcmovnbe st(0), st(%1d)",i_mod-0xD0);
				else if (i_mod <0xE0) prxntf("fcmovnu st(0), st(%1d)", i_mod-0xD8);
				else if (i_mod==0xE2) prxntf("fnclex");
				else if (i_mod==0xE3) prxntf("fninit");
				else if (i_mod <0xE8) fatalError=208;
				else if (i_mod <0xF0) prxntf("fucomi st(0), st(%1d)", i_mod-0xE8);
				else if (i_mod <0xF8) prxntf("fcomi st(0), st(%1d)", i_mod-0xF0);
			}
			break;
		case 0xDC: 
			if (i_mod<0xC0)
			{
			       switch(regTable[i_mod])
				   {
				       case 0: prxntf("fadd "); prxntf("64real"); r_m_( 0); break;
					   case 1: prxntf("fmul "); prxntf("64real"); r_m_( 0); break;
					   case 2: prxntf("fcom "); prxntf("64real"); r_m_( 0); break;
					   case 3: prxntf("fcomp ");prxntf("64real"); r_m_( 0); break;
					   case 4: prxntf("fsub "); prxntf("64real"); r_m_( 0); break;
					   case 5: prxntf("fsubr ");prxntf("64real"); r_m_( 0); break;
					   case 6: prxntf("fdiv "); prxntf("64real"); r_m_( 0); break;
					   case 7: prxntf("fdivr ");prxntf("64real"); r_m_( 0); break;
					   default:	fatalError=210;
				   }
			}
			else
			{
			    if (i_mod<0xC8)       prxntf("fadd st(0), st(%1d)", i_mod-0xC0);
				else if (i_mod <0xD0) prxntf("fmul st(0), st(%1d)", i_mod-0xC8);
				else if (i_mod <0xE0) fatalError=212;
				else if (i_mod <0xE8) prxntf("fsubr st(0), st(%1d)",i_mod-0xE0);
				else if (i_mod <0xF0) prxntf("fsub st(0), st(%1d)", i_mod-0xD8);
				else if (i_mod <0xF8) prxntf("fdivr st(0), st(%1d)", i_mod-0xF0);
				else                  prxntf("fdiv st(0), st(%1d)", i_mod-0xF8);
			}
			break;
		case 0xDD: 
			if (i_mod<0xC0)
			{
			       switch(regTable[i_mod])
				   {
				       case 0: prxntf("fld ");  prxntf("64real");   r_m_( 0);break;
					   case 2: prxntf("fst ");  prxntf("64real");   r_m_( 0);break;
					   case 3: prxntf("fstp "); prxntf("64real");   r_m_( 0);break;
					   case 4: prxntf("frstor");prxntf("94/108byte");r_m_( 0);break;
					   case 6: prxntf("fnsave ");prxntf("94/108byte");r_m_( 0);break;
					   case 7: prxntf("fnstsw ");prxntf("2byte"); r_m_( 0); break;
					   default:	fatalError=214;
				   }
			}
			else
			{
			    if (i_mod<0xC8)       prxntf("ffree st(%1d)", i_mod-0xC0);
				else if (i_mod <0xD0) fatalError=216;
				else if (i_mod <0xD8) prxntf("fst st(%1d)",   i_mod-0xD0);
				else if (i_mod <0xE0) prxntf("fstp st(%1d)",  i_mod-0xD8);
				else if (i_mod==0xE1) prxntf("fucom");
				else if (i_mod <0xE8) prxntf("fucom st(%1d)", i_mod-0xE0);
				else if (i_mod==0xE9) prxntf("fucomp");
				else if (i_mod <0xF0) prxntf("fucomp st(%1d)",i_mod-0xE8);
				else fatalError=218;
			}
			break;
		case 0xDE: 
			if (i_mod<0xC0)
			{
			       switch(regTable[i_mod])
				   {
				       case 0: prxntf("fiadd ");  prxntf("16int");r_m_( 0); break;
					   case 1: prxntf("fimul ");  prxntf("16int");r_m_( 0); break;
					   case 2: prxntf("ficom ");  prxntf("16int");r_m_( 0); break;
					   case 3: prxntf("ficomp "); prxntf("16int");r_m_( 0); break;
					   case 4: prxntf("fisub ");  prxntf("16int");r_m_( 0); break;
					   case 5: prxntf("fisubr "); prxntf("16int");r_m_( 0); break;
					   case 6: prxntf("fidiv ");  prxntf("16int");r_m_( 0); break;
					   case 7: prxntf("fidivr "); prxntf("16int");r_m_( 0); break;
					   default:	fatalError=220;
				   }
			}
			else
			{
			     if(i_mod==0xC1)       prxntf("faddp");
				 else if (i_mod <0xC8) prxntf("faddp st(%1d), st(0)", i_mod-0xC0);
				 else if (i_mod==0xC9) prxntf("fmulp");
				 else if (i_mod <0xD0) prxntf("fmulp st(%1d), st(0)", i_mod-0xC8);
				 else if (i_mod==0xD9) prxntf("fcompp");
				 else if (i_mod <0xE0) fatalError=222;
				 else if (i_mod==0xE1) prxntf("fsubrp");
				 else if (i_mod <0xE8) prxntf("fsubrp st(%1d), st(0)", i_mod-0xE0);
				 else if (i_mod==0xE9) prxntf("fsubp");
				 else if (i_mod <0xF0) prxntf("fsubp st(%1d), st(0)", i_mod-0xE8);
				 else if (i_mod==0xF1) prxntf("fdivrp");
				 else if (i_mod <0xF8) prxntf("fdivrp st(%1d), st(0)", i_mod-0xF0);
				 else if (i_mod==0xF9) prxntf("fdivp");
				 else                  prxntf("fdivp st(%1d), st(0)", i_mod-0xF8);
			}
			break;
		case 0xDF: 
			if (i_mod<0xC0)
			{
			       switch(regTable[i_mod])
				   {
				       case 0: prxntf("fild ");  prxntf("16int");r_m_( 0); break;
					   case 2: prxntf("fist ");  prxntf("16int");r_m_( 0); break;
					   case 3: prxntf("fistp "); prxntf("16int");r_m_( 0); break;
					   case 4: prxntf("fbld ");  prxntf("80bcd");r_m_( 0); break;
					   case 5: prxntf("fild ");  prxntf("64int");r_m_( 0); break;
					   case 6: prxntf("fbstp "); prxntf("80bcd");r_m_( 0); break;
					   case 7: prxntf("fistp "); prxntf("64int");r_m_( 0); break;
					   default:	                 fatalError=224;
				   }
			}
			else
			{
			     if(i_mod <0xDF)       fatalError=226;
				 else if (i_mod==0xE0) prxntf("fnstsw ax");
				 else if (i_mod <0xE8) fatalError=228;
				 else if (i_mod <0xF0) prxntf("fucomip st(0), st(%1d)", i_mod-0xE8);
				 else if (i_mod <0xF8) prxntf("fcomip st(0), st(%1d)", i_mod-0xF0);
				 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: prxntf("inc ");            r_m_(rr); break;
	    case 1: prxntf("dec ");            r_m_(rr); break;
	    case 2: prxntf("call ");    
		        if (nextMode)
				{
				     ref = r_m_(rr);
				    class=13;
					if (i_mod>=0xD0)
					{
					    reg=rmTable[i_mod];
					    if (temppos[reg]+128>cur_position) 
						ref=tempref[reg]; temppos[reg]=cur_position;
					}
		        }
				else
				    if (!printName(cur_position)) r_m_(rr);
				break;
	    case 3: prxntf("call ");     ref = m16_32(); class=17; 
		        break;
	    case 4: prxntf("jmp ");      
				if (nextMode)
				{
				    ref = r_m_(32); 
					if (gotJmpRef) 
					{   class=128+5; gotJmpRef=0;  } 
					else class=5;
					// it is OK to mark anchor...because it will not be erased easily??
					lastAnchor=cur_position+i_col-1;
					if (nextMode)
					*(unsigned char *)((int)lpMap+a_loc_save+delta+i_col-1) |= 0x80;
					//leaveFlag=cur_position+i_col;
				}
				else 
					if (!printName(cur_position)) r_m_(rr);
				break;
	    case 5: prxntf("jmp ");      ref = m16_32();   class = 9; 
		        break;
	    case 6: prxntf("push ");     ref =  r_m_(rr);
		        class = 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: prxntf("test "); r_m_( 8); prxntf(", "); print_i_byte(); break;
			case 2:	prxntf("not ");  r_m_( 8); break;
			case 3:	prxntf("neg ");  r_m_( 8); break;
			case 4:	prxntf("mul ");  r_m_( 8); break;
			case 5:	prxntf("imul "); r_m_( 8); break;
			case 6:	prxntf("div ");  r_m_( 8); break;
			case 7:	prxntf("idiv "); r_m_( 8); break;
			default: fatalError=303;
		}
	}
	else if (i_opcode==0xF7)
	{
	    switch(regTable[i_mod])
		{
		    case 0:	prxntf("test "); r_m_(rr); prxntf(", "); print_i_dword(); break;
			case 2:	prxntf("not ");  r_m_(rr); break;
			case 3:	prxntf("neg ");  r_m_(rr); break;
			case 4:	prxntf("mul ");  r_m_(rr); break;
			case 5:	prxntf("imul "); r_m_(rr); break;
			case 6:	prxntf("div ");  r_m_(rr); break;
			case 7:	prxntf("idiv "); r_m_(rr); break;
			default: fatalError=00305;
		}
	}
	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)
		{
		    prxntf("fstenv 14/28byte"); r_m_(rr);
		}
		else if (regTable[i_mod]==7)
		{
		    prxntf("fstcw 2byte");      r_m_(rr);
		}
		else fatalError=309;
	}
	else if (i_opcode==0xDB)
	{
	    if (i_mod==0xE2)      prxntf("fclex ");
		else if (i_mod==0xE3) prxntf("finit ");
		else fatalError=311;
	}
	else if (i_opcode==0xDD)
	{
	    if (regTable[i_mod]==6)
		{
		    prxntf("fsave 94/108byte"); r_m_(rr);
		}
		else if (regTable[i_mod]==7)
		{
		    prxntf("fstsw 2byte");      r_m_(rr);
		}
		else fatalError=313;
	}
	else if (i_opcode==0xDF)
	{
	    if (i_mod==0xE0) prxntf("fstsw ax ");
		else fatalError=315;
	}
	else if (i_opcode==0x9B) prxntf("wait");
	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: prxntf("repne cmpsb"); break;
			case 0xA7: if (operandOveride) prxntf("repne cmpsw");
				       else                prxntf("repne cmpsd");     break;
			case 0xAE: prxntf("repne scasb"); break;
			case 0xAF: if (operandOveride) prxntf("repne scasw");
				       else                prxntf("repne scasd");     break;
			default: fatalError=319;
		}
	}
	else if (prefixStack[i_psp-1]==0xF3)
	{
	    switch(i_opcode)
		{
		    case 0x6C: prxntf("rep ins byte"); 
			           r_m_( 8);prxntf(", port[dx]"); 
			           break;
			case 0x6D: if (operandOveride) prxntf("rep ins word");
				       else                prxntf("rep ins dword");
					   r_m_(rr);prxntf(", port[dx]"); 
					   break; 
			case 0x6E: prxntf("rep outs port[dx], byte");  
			           r_m_( 8); 
			           break;
			case 0x6F: if (operandOveride) prxntf("rep outs port[dx], word");
			           else prxntf("rep outs port[dx], dword"); 
			           r_m_(rr); 
					   break;
			case 0xA4: prxntf("rep movsb");                           
			           break;
			case 0xA5: if (operandOveride) prxntf("rep movsw");
				       else                prxntf("rep movsd");       
					   break;
			case 0xA6: prxntf("repe cmpsb");                          
			           break;
			case 0xA7: if (operandOveride) prxntf("repe cmpsw");
				       else                prxntf("repe cmpsd");      
					   break;
			case 0xAA: prxntf("rep stosb");                           
			           break;
			case 0xAB: if (operandOveride) prxntf("rep stosw");
				       else                prxntf("rep stosd");       
					   break;
			case 0xAC: prxntf("rep lods al");                         
			           break;
			case 0xAD: if (operandOveride) prxntf("rep lods ax");
				       else                prxntf("rep lods eax");    
					   break;
			case 0xAE: prxntf("repe scasb");                          
			           break;
			case 0xAF: if (operandOveride) prxntf("repe scasw");
				       else                prxntf("repe scasd");      
					   break; 
			default: fatalError=321;
		}
	}
	else fatalError=323;
	return 0;
}

/* *************************************************************** */
/* *************************************************************** */
/*         2 byte opcode printing starts here!                     */
/* *************************************************************** */
/* *************************************************************** */
int print20case()
{
    switch(i_opcode)
	{
	    case 0x06:  prxntf("clts");       break;
		case 0x08:  prxntf("invd");       break;
		case 0x09:  prxntf("wbinvd");     break; 
		case 0x0B:  prxntf("ud2");        break;   
		case 0x30:  prxntf("wrmsr");	  break;
		case 0x31:  prxntf("rdtsc");	  break;
		case 0x32:  prxntf("rdmsr");	  break;
		case 0x33:  prxntf("rdpmc");	  break;
		case 0x77:  prxntf("emms");       break;   
		case 0xA0:  prxntf("push fs"); break;   
		case 0xA1:  prxntf("pop fs");     break;  
		case 0xA2:  prxntf("cpuid");      break;   
		case 0xA8:  prxntf("push gs");    break;   
		case 0xA9:  prxntf("pop gs");     break;   
		case 0xAA:  prxntf("rsm");	      break;   
		case 0xC8:  prxntf("bswap eax");  break;   
		case 0xC9:  prxntf("bswap ecx");  break;   
		case 0xCA:  prxntf("bswap edx");  break;   
		case 0xCB:  prxntf("bswap ebx");  break;   
		case 0xCC:  prxntf("bswap esp");  break;   
		case 0xCD:  prxntf("bswap ebp");  break;   
		case 0xCE:  prxntf("bswap esi");  break;   
		case 0xCF:  prxntf("bswap edi");  break;   
		default:    fatalError=325;
	}
	return 0;
}

int print21case()
{
    switch(i_opcode)
	{
		case 0x80:  prxntf("jo ");	break;
		case 0x81:  prxntf("jno ");	break;
		case 0x82:  prxntf("jb ");	break;
		case 0x83:  prxntf("jae ");	break;
		case 0x84:  prxntf("je ");	break;
		case 0x85:  prxntf("jne ");	break;
		case 0x86:  prxntf("jbe ");	break;
		case 0x87:  prxntf("ja ");	break;
		case 0x88:  prxntf("js ");	break;
		case 0x89:  prxntf("jns ");	break;
		case 0x8A:  prxntf("jpe ");	break;
		case 0x8B:  prxntf("jpo ");	break;
		case 0x8C:  prxntf("jl ");	break;
		case 0x8D:  prxntf("jge ");	break;
		case 0x8E:  prxntf("jle ");	break;
		case 0x8F:  prxntf("jg ");	break;
		default:    fatalError=327;
	}	
	ref = print_rel32();  class =  4; 
	return 0;
}

int print22case()
{
int    rr;

	if (operandOveride) rr=16; else rr=32;

    switch(i_opcode)
	{
		case 0x02: prxntf("lar ");       r___(rr);prxntf(", ");r_m_(rr);break;    
		case 0x03: prxntf("lsl ");       r___(rr);prxntf(", ");r_m_(rr);break;    
		case 0x20: prxntf("mov "); r___(rr);prxntf(", cr%1d", rmTable[i_mod]);
		                                             

⌨️ 快捷键说明

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