📄 unasmarmdlg.cpp
字号:
// 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 + -