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

📄 cstrategy.cpp

📁 将exe等可执行文件转化成c程序的反编译程序,先到汇编再到c
💻 CPP
字号:
// Copyright(C) 1999-2005 LiuTaoTao,bookaa@rorsoft.com

#include "stdafx.h"
#include "CStrategy.h"


CStrategy g_CStrategy;

    
bool CStrategy::DoIt_Addon(INSTR_LIST* list, CExprManage* expr)
{
    assert(m_es == ES_Instr_can_Elim_21E);
    M_t* v = this->can_elim.pvar;
    PINSTR p1 = this->can_elim.p1;
    PINSTR p2 = this->can_elim.p2;
    
    return false;
}
void AddOn_serial(Pst_InstrAddOn &p1, st_InstrAddOn* p2)
{
    Pst_InstrAddOn* pp = &p1;
    while (*pp != NULL)
    {
        pp = &p1->pChild;
    }
    *pp = p2;
}
void CStrategy::DoIt(INSTR_LIST* list, CExprManage* expr)
{
	switch (m_es)
	{
	case ES_Instr_can_Delete:
		{
			list->RemoveAt(list->Find(this->can_delete.pinstr));
		}
		break;
    case ES_Instr_can_Elim_21E:
        {
            if (this->DoIt_Addon(list,expr))
                break;
            
			PINSTR p1 = this->can_elim.p1;
			PINSTR p2 = this->can_elim.p2;

            M_t* v = this->can_elim.pvar;
            M_t* varnew = expr->CreateNewTemVar(v->size);

            p1->var_w.thevar = varnew;
            if (p2->var_r1.thevar == v)
                p2->var_r1.thevar = varnew;
            if (p2->var_r2.thevar == v)
                p2->var_r2.thevar = varnew;
        }
        break;
    case ES_Instr_can_Elim_31E:
        {
			PINSTR p1 = this->can_elim.p1;
			PINSTR p2 = this->can_elim.p2;
            assert(p2->var_r2.type == v_Immed);
            signed int d = p1->var_r2.d;
            if (p1->type == i_Add)
                d = -d;
            p2->var_r2.d += d;
			list->RemoveAt(list->Find(p1));
        }
        break;
	case ES_Instr_can_Elim_25E:
		{
			PINSTR p1 = this->can_elim.p1;
			PINSTR p2 = this->can_elim.p2;
            p1->var_w = p2->var_w;
            /*
			if (IsSame(&p2->var_r1, this->can_elim.pvar))
				p2->var_r1 = p1->var_r1;
			if (IsSame(&p2->var_r2, this->can_elim.pvar))
				p2->var_r2 = p1->var_r1;
                */

			list->RemoveAt(list->Find(p2));
		}
		break;
	case ES_Instr_can_Elim_63:
		{
			PINSTR p1 = this->can_elim.p1;
			PINSTR p2 = this->can_elim.p2;

			if (p2->var_r1.thevar == this->can_elim.pvar)
            {
				p2->var_r1 = p1->var_r1;
                AddOn_serial(p2->va_r1.pao, p1->va_r1.pao);
            }
			if (p2->var_r2.thevar == this->can_elim.pvar)
            {
				p2->var_r2 = p1->var_r1;
                AddOn_serial(p2->va_r2.pao, p1->va_r1.pao);
            }

			list->RemoveAt(list->Find(p1));
		}
		break;
	}

    this->m_es = ES_Error;
}

void CStrategy::PrintIt(INSTR_LIST* list, CFunc* pFunc)
{
    log_prtl("---");
	switch (m_es)
	{
	case ES_Instr_can_Delete:
		{
			log_prtl("%s: %s", this->can_delete.reason, this->can_delete.pvar->GetName());
			CString s = this->PrintOne(list, this->can_delete.pinstr, pFunc);
			s += "  <----";
		}
		break;
	case ES_Instr_can_Elim_63:
	case ES_Instr_can_Elim_31E:
	case ES_Instr_can_Elim_25E:
	case ES_Instr_can_Elim_21E:
		{
			log_prtl("%s: %s", this->can_elim.reason, this->can_elim.pvar->GetName());
			CString s1 = this->PrintOne(list, this->can_elim.p1, pFunc);
			CString s2 = this->PrintOne(list, this->can_elim.p2, pFunc);
			log_prtl(s1);
			log_prtl(s2);
		}
		break;
	}
    log_prtl("---");
}

CString CStrategy::PrintOne(INSTR_LIST* list, PINSTR pinstr, CFunc* pFunc)
{
    POSITION pos = list->GetHeadPosition();
    while (pos)
    {
        PINSTR p = list->GetNext(pos);
        if (p == pinstr)
        {
            CFunc_Prt the(pFunc);
            POSITION pos1 = list->Find(pinstr);
            CString s = the.prt_the_instr(p);
            return s;
        }
    }
    return "";
}

void CStrategy::AddOne_CanDelete(M_t* pvar, PINSTR pinstr, PCSTR reason)
{
	this->m_es = ES_Instr_can_Delete;
	this->can_delete.pvar = pvar;
	this->can_delete.pinstr = pinstr;
	strcpy(this->can_delete.reason, reason);
}
void CStrategy::AddOne_CanEliminate_25E(M_t* pvar, PINSTR p1, PINSTR p2, PCSTR reason)
//可以消去
{
	this->m_es = ES_Instr_can_Elim_25E;
	this->can_elim.pvar = pvar;
	this->can_elim.p1 = p1;
	this->can_elim.p2 = p2;
	strcpy(this->can_elim.reason, reason);
}
void CStrategy::AddOne_CanEliminate_31E(M_t* pvar, PINSTR p1, PINSTR p2, PCSTR reason)
//可以消去
{
	this->m_es = ES_Instr_can_Elim_31E;
	this->can_elim.pvar = pvar;
	this->can_elim.p1 = p1;
	this->can_elim.p2 = p2;
	strcpy(this->can_elim.reason, reason);
}
void CStrategy::AddOne_CanEliminate_21E(M_t* pvar, PINSTR p1, PINSTR p2, PCSTR reason)
//可以消去
{
	this->m_es = ES_Instr_can_Elim_21E;
	this->can_elim.pvar = pvar;
	this->can_elim.p1 = p1;
	this->can_elim.p2 = p2;
	strcpy(this->can_elim.reason, reason);
}
void CStrategy::AddOne_CanEliminate_63(M_t* pvar, PINSTR p1, PINSTR p2, PCSTR reason)
//可以消去
{
	this->m_es = ES_Instr_can_Elim_63;
	this->can_elim.pvar = pvar;
	this->can_elim.p1 = p1;
	this->can_elim.p2 = p2;
	strcpy(this->can_elim.reason, reason);
}

⌨️ 快捷键说明

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