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

📄 unasmarmdlg.cpp

📁 VC写的一个可以对ARM进行反汇编的工具的原代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// UnasmARMDlg.cpp : implementation file
//

#include "stdafx.h"
#include "UnasmARM.h"
#include "UnasmARMDlg.h"
#include <stdio.h>
#include <string.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAboutDlg)
protected:
    virtual void DoDataExchange (CDataExchange* pDX);   // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    //{{AFX_MSG(CAboutDlg)
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog (CAboutDlg::IDD)
{
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange (CDataExchange* pDX)
{
    CDialog::DoDataExchange (pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP (CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUnasmARMDlg dialog

CUnasmARMDlg::CUnasmARMDlg (CWnd* pParent /*=NULL*/)
        : CDialog (CUnasmARMDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CUnasmARMDlg)
    m_filename1 = _T ("");
    m_filename2 = _T ("");
    m_filename3 = _T ("");
    m_Hex = TRUE;
    m_Radio1 = -1;
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon (IDR_MAINFRAME);
}

void CUnasmARMDlg::DoDataExchange (CDataExchange* pDX)
{
    CDialog::DoDataExchange (pDX);
    //{{AFX_DATA_MAP(CUnasmARMDlg)
    DDX_Text (pDX, IDC_EDIT1, m_filename1);
    DDX_Text (pDX, IDC_EDIT2, m_filename2);
    DDX_Text (pDX, IDC_EDIT3, m_filename3);
    DDX_Check (pDX, IDC_CHECK1, m_Hex);
    DDX_Radio (pDX, IDC_RADIO1, m_Radio1);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP (CUnasmARMDlg, CDialog)
//{{AFX_MSG_MAP(CUnasmARMDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED (IDC_BUTTON1, OnButton1)
ON_BN_CLICKED (IDC_BUTTON2, OnButton2)
ON_BN_CLICKED (IDC_BUTTON3, OnButton3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUnasmARMDlg message handlers

BOOL CUnasmARMDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT ( (IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT (IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu (FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString (IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty() )
        {
            pSysMenu->AppendMenu (MF_SEPARATOR);
            pSysMenu->AppendMenu (MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon (m_hIcon, TRUE);  // Set big icon
    SetIcon (m_hIcon, FALSE); // Set small icon

    // TODO: Add extra initialization here

// m_filename1 = _T("D:\\下载资料\\5110v530\\5110v530.fls");
// m_filename2 = _T("D:\\下载资料\\5110v530\\5110v530.ref");
// m_filename3 = _T("D:\\下载资料\\5110v530\\5110v530.asm");
    m_Radio1 = 0;
    UpdateData (FALSE);
    strcpy (RegisterName[0], "R0");
    strcpy (RegisterName[1], "R1");
    strcpy (RegisterName[2], "R2");
    strcpy (RegisterName[3], "R3");
    strcpy (RegisterName[4], "R4");
    strcpy (RegisterName[5], "R5");
    strcpy (RegisterName[6], "R6");
    strcpy (RegisterName[7], "R7");
    strcpy (RegisterName[8], "R8");
    strcpy (RegisterName[9], "R9");
    strcpy (RegisterName[10], "R10");
    strcpy (RegisterName[11], "R11");
    strcpy (RegisterName[12], "R12");
    strcpy (RegisterName[13], "SP");
    strcpy (RegisterName[14], "LR");
    strcpy (RegisterName[15], "PC");
    regNo = -1;
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CUnasmARMDlg::OnSysCommand (UINT nID, LPARAM lParam)
{
    if ( (nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand (nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CUnasmARMDlg::OnPaint()
{
    if (IsIconic() )
    {
        CPaintDC dc (this); // device context for painting

        SendMessage (WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics (SM_CXICON);
        int cyIcon = GetSystemMetrics (SM_CYICON);
        CRect rect;
        GetClientRect (&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon (x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CUnasmARMDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

void CUnasmARMDlg::OnOK()
{
    // TODO: Add extra validation here

    // CDialog::OnOK();
    UpdateData (TRUE);
    if (m_filename1.IsEmpty() )
    {
        AfxMessageBox ("You must specify source filename");
        return;
    }
    if (m_filename2.IsEmpty() )
    {
        AfxMessageBox ("You must specify Reference filename");
        return;
    }
    if (m_filename3.IsEmpty() )
    {
        AfxMessageBox ("You must specify Target filename");
        return;
    }

    FILE *fd_src, *fd_ref, *fd_tar;

    fd_src = fopen (m_filename1, "rb");
    if (fd_src == NULL)
    {
        AfxMessageBox ("Source file not found.");
        return;
    }

    fd_ref = fopen (m_filename2, "r");
    if (fd_ref == NULL)
    {
        fclose (fd_src);
        AfxMessageBox ("Reference file not found.");
        return;
    }

    fd_tar = fopen (m_filename3, "w");
    if (fd_tar == NULL)
    {
        fclose (fd_src);
        fclose (fd_ref);
        AfxMessageBox ("Error creating target file.");
        return;
    }

#define ARM_MODE   0x1
#define THUMB_MODE 0x2
    char ref_buffer[1024];
    int  theMode = ARM_MODE;
    long addr = 0;
    long addr1, addr2;    //Unasm
    int  i;
    /*
    $ADDRESS=0x200000
    $ARM
    $UN0x0,0x0fff
    $REM This is a subroutine
    $DB0x1000,0x10ff     // Define Byte
    $DC0x1000,0x10ff     // Define Code
    $DH0x1100,0x11ff     // Define Halfword
    $DW0x1200,0x12ff     // Define Word
    $DF0x1300,0x13FF     // Define Float
    $DD0x1400,0x14FF     // Define Double
    $THUMB
    $UN0x2000,0x20FF
    $END
    */
    for (;;)
    {
        i = fscanf (fd_ref, "%s", ref_buffer);
        if (i < 0) break;

        if (_memicmp ( ref_buffer, "$REM", 4) == 0)
        {         // Remark
            while (1)
            {
                i = fscanf (fd_ref, "%s", ref_buffer);
                if (i < 0) break;
                if (ref_buffer[0] == '$')
                {
                    fwrite ("\n", 1, 1, fd_tar);
                    if (_memicmp ( ref_buffer, "$REM", 4) == 0)
                    { // Remark
                        continue;
                    }
                    break;
                }
                fwrite (ref_buffer, 1, strlen (ref_buffer), fd_tar);
                fwrite (" ", 1, 1, fd_tar);
            }
            if (i < 0) break;
        }

        if (_memicmp ( ref_buffer, "$END", 4) == 0)
        {         // $END
            break;
        }
        if (_memicmp ( ref_buffer, "$ARM", 4) == 0)
        {         // $ARM
            regNo = -1;
            theMode = ARM_MODE;
            continue;
        }
        if (_memicmp ( ref_buffer, "$THUMB", 6) == 0)
        {       // $THUMB
            regNo = -1;
            theMode = THUMB_MODE;
            continue;
        }
        if (_memicmp ( ref_buffer, "$ADDRESS=0x", 11) == 0)
        { // $ADDRESS
            addr = GetHex (&ref_buffer[11]);
            continue;
        }
        if (_memicmp ( ref_buffer, "$UN0X", 5) == 0)
        {       // $UN
            addr1 = GetHex (&ref_buffer[5]);
            addr2 = addr1 + 0x7f;                            // 0x80 bytes
            i = 0;
            for (;;)
            {
                if ( (ref_buffer[i] == '\0') || (ref_buffer[i] == ',') )
                    break;
                i++;
            }
            if (ref_buffer[i] == ',')
            {
                i++;
                if (_memicmp ( &ref_buffer[i], "0x", 2) == 0)
                {
                    addr2 = GetHex (&ref_buffer[i+2]);
                    if (addr2 <= addr1) continue;
                }
            }
            // Now we can disassembly from addr1 to addr2
            if (theMode == ARM_MODE)
                dis_arm (fd_src, fd_tar, addr, addr1, addr2);
            else
                dis_thumb (fd_src, fd_tar, addr, addr1, addr2);

            continue;
        }
        if ( (ref_buffer[0] == '$' ) &&
                (toupper (ref_buffer[1]) == 'D') )
        {            // $DB/DH/DW/DC/DD/DF

            char ch;
            int d_mode = 0;
            ch = toupper (ref_buffer[2]);
            switch (ch)
            {
            case 'B':
                d_mode = 1;                              // $DB
                break;
            case 'C':
                d_mode = 3;                              // $DC
                break;
            case 'D':
                d_mode = 5;                              // $DD
                break;
            case 'F':
                d_mode = 6;                              // $DF
                break;
            case 'H':
                d_mode = 2;                              // $DH
                break;
            case 'W':
                d_mode = 4;                              // $DW
                break;
            }
            if (!d_mode) continue;
            if (_memicmp ( &ref_buffer[3], "0x", 2) == 0)
            {
                addr1 = GetHex (&ref_buffer[5]);
                addr2 = addr1 + 0x7f;                        // 0x80 bytes
                i = 0;
                for (;;)
                {
                    if ( (ref_buffer[i] == '\0') || (ref_buffer[i] == ',') )
                        break;
                    i++;
                }
                if (ref_buffer[i] == ',')
                {
                    i++;
                    if (_memicmp ( &ref_buffer[i], "0x", 2) == 0)
                    {
                        addr2 = GetHex (&ref_buffer[i+2]);
                        if (addr2 <= addr1) continue;
                    }
                }
                // Now we can dump data from addr1 to addr2
                switch (d_mode)
                {
                case 1:
                    dump_byte (fd_src, fd_tar, addr, addr1, addr2);
                    break;
                case 2:
                    dump_halfword (fd_src, fd_tar, addr, addr1, addr2);
                    break;
                case 3:
                    dump_byte_nochar (fd_src, fd_tar, addr, addr1, addr2);
                    break;
                case 4:
                    dump_word (fd_src, fd_tar, addr, addr1, addr2);
                    break;
                case 5:
                    dump_double (fd_src, fd_tar, addr, addr1, addr2);
                    break;
                case 6:

⌨️ 快捷键说明

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