📄 unasmarmdlg.cpp
字号:
dump_float (fd_src, fd_tar, addr, addr1, addr2);
break;
}
}
continue;
}
}
fclose (fd_src);
fclose (fd_ref);
fclose (fd_tar);
AfxMessageBox ("Successful");
}
long CUnasmARMDlg::GetHex (char * str)
{
int i;
long v;
char ch;
for (i = 0, v = 0; str[i]; i++)
{
ch = toupper (str[i]);
if ( (ch >= '0') && (ch <= '9') )
{
v = v * 16 + ch - '0';
continue;
}
if ( (ch >= 'A') && (ch <= 'F') )
{
v = v * 16 + ch - 'A' + 10;
continue;
}
break;
}
return v;
}
int CUnasmARMDlg::dump_byte (FILE *fd_src, FILE *fd_tar, long addr, long addr1, long addr2)
{
int i, loc_str;
long bytes;
char src_buffer[16384];
char string[32];
string[0] = ' ';
i = fseek (fd_src, addr1, SEEK_SET);
bytes = addr2 - addr1 + 1;
while (bytes)
{
int loc, times_16, remains_16;
int bytes1 = (bytes <= 16384) ? bytes : 16384;
char str[128];
int k, l;
if (addr1 & 15)
{
if ( (16 - (addr1 & 15) ) < bytes1)
bytes1 = 16 - (addr1 & 15);
}
bytes -= bytes1;
i = fread ( src_buffer, 1, bytes1, fd_src);
if (i > 0)
{
bytes1 = i; // Bytes actually
times_16 = bytes1 >> 4;
remains_16 = bytes1 & 0x0f;
l = 0;
while (times_16)
{
loc_str = 1;
sprintf (str, "%08x ", addr + addr1);
for (k = 0; k < 16; k++, l++)
{
loc = strlen (str);
sprintf (&str[loc], "%02X ", 0xff & src_buffer[l]);
string[loc_str++] = (src_buffer[l] >= ' ') ? src_buffer[l] : '.';
}
string[loc_str] = '\0';
strcat (str, string);
str[33] = '-';
loc = strlen (str);
str[loc++] = '\n';
str[loc] = '\0';
fwrite (str, 1, loc, fd_tar);
times_16--;
addr1 += 16;
}
if (remains_16)
{
memset (str, ' ', 128);
loc_str = 1;
sprintf (str, "%08x ", addr + addr1);
for (k = 0; k < remains_16; k++, l++)
{
loc = strlen (str);
sprintf (&str[loc], "%02X ", 0xff & src_buffer[l]);
string[loc_str++] = (src_buffer[l] >= ' ') ? src_buffer[l] : '.';
}
string[loc_str] = '\0';
loc = strlen (str);
str[loc] = ' ';
str[58] = '\0';
strcat (str, string);
if (remains_16 > 8)
str[33] = '-';
loc = strlen (str);
str[loc++] = '\n';
str[loc] = '\0';
fwrite (str, 1, loc, fd_tar);
addr1 += remains_16;
}
}
}
fwrite ("\n", 1, 1, fd_tar);
return 0;
}
int CUnasmARMDlg::dump_halfword (FILE * fd_src, FILE * fd_tar, long addr, long addr1, long addr2)
{
int i, loc_str;
long bytes;
char src_buffer[16384];
i = fseek (fd_src, addr1, SEEK_SET);
bytes = addr2 - addr1 + 1;
while (bytes)
{
int loc, times_16, remains_16;
int bytes1 = (bytes <= 16384) ? bytes : 16384;
char str[128];
int k, l;
if (addr1 & 15)
{
if ( (16 - (addr1 & 15) ) < bytes1)
bytes1 = 16 - (addr1 & 15);
}
bytes -= bytes1;
i = fread ( src_buffer, 1, bytes1, fd_src);
if (i > 0)
{
bytes1 = i; // Bytes actually
times_16 = bytes1 >> 4;
remains_16 = (bytes1 & 0x0f) >> 1;
l = 0;
while (times_16)
{
loc_str = 1;
sprintf (str, "%08x ", addr + addr1);
for (k = 0; k < 8; k++, l += 2)
{
loc = strlen (str);
if (m_Radio1)
{
sprintf (&str[loc], "%02X%02X ",
0xff & src_buffer[l],
0xff & src_buffer[l+1]);
}
else
{
sprintf (&str[loc], "%02X%02X ",
0xff & src_buffer[l+1],
0xff & src_buffer[l]);
}
}
loc = strlen (str);
str[loc-1] = '\n';
fwrite (str, 1, loc, fd_tar);
times_16--;
addr1 += 16;
}
if (remains_16)
{
loc_str = 1;
sprintf (str, "%08x ", addr + addr1);
for (k = 0; k < remains_16; k++, l += 2)
{
loc = strlen (str);
if (m_Radio1)
{
sprintf (&str[loc], "%02X%02X ",
0xff & src_buffer[l],
0xff & src_buffer[l+1]);
}
else
{
sprintf (&str[loc], "%02X%02X ",
0xff & src_buffer[l+1],
0xff & src_buffer[l]);
}
}
loc = strlen (str);
str[loc-1] = '\n';
fwrite (str, 1, loc, fd_tar);
addr1 += (remains_16 << 1);
}
}
}
fwrite ("\n", 1, 1, fd_tar);
return 0;
}
int CUnasmARMDlg::dump_word (FILE * fd_src, FILE * fd_tar, long addr, long addr1, long addr2)
{
int i, loc_str;
long bytes;
char src_buffer[16384];
i = fseek (fd_src, addr1, SEEK_SET);
bytes = addr2 - addr1 + 1;
while (bytes)
{
int loc, times_16, remains_16;
int bytes1 = (bytes <= 16384) ? bytes : 16384;
char str[128];
int k, l;
if (addr1 & 15)
{
if ( (16 - (addr1 & 15) ) < bytes1)
bytes1 = 16 - (addr1 & 15);
}
bytes -= bytes1;
i = fread ( src_buffer, 1, bytes1, fd_src);
if (i > 0)
{
bytes1 = i; // Bytes actually
times_16 = bytes1 >> 4;
remains_16 = (bytes1 & 0x0f) >> 2;
l = 0;
while (times_16)
{
loc_str = 1;
sprintf (str, "%08x ", addr + addr1);
for (k = 0; k < 4; k++, l += 4)
{
loc = strlen (str);
if (m_Radio1)
{
sprintf (&str[loc], "%02X%02X%02X%02X ",
0xff & src_buffer[l],
0xff & src_buffer[l+1],
0xff & src_buffer[l+2],
0xff & src_buffer[l+3]);
}
else
{
sprintf (&str[loc], "%02X%02X%02X%02X ",
0xff & src_buffer[l+3],
0xff & src_buffer[l+2],
0xff & src_buffer[l+1],
0xff & src_buffer[l]);
}
}
loc = strlen (str);
str[loc-1] = '\n';
fwrite (str, 1, loc, fd_tar);
times_16--;
addr1 += 16;
}
if (remains_16)
{
loc_str = 1;
sprintf (str, "%08x ", addr + addr1);
for (k = 0; k < remains_16; k++, l += 4)
{
loc = strlen (str);
if (m_Radio1)
{
sprintf (&str[loc], "%02X%02X%02X%02X ",
0xff & src_buffer[l],
0xff & src_buffer[l+1],
0xff & src_buffer[l+2],
0xff & src_buffer[l+3]);
}
else
{
sprintf (&str[loc], "%02X%02X%02X%02X ",
0xff & src_buffer[l+3],
0xff & src_buffer[l+2],
0xff & src_buffer[l+1],
0xff & src_buffer[l]);
}
}
loc = strlen (str);
str[loc-1] = '\n';
fwrite (str, 1, loc, fd_tar);
addr1 += (remains_16 << 2);
}
}
}
fwrite ("\n", 1, 1, fd_tar);
return 0;
}
int CUnasmARMDlg::dis_arm (FILE * fd_src, FILE * fd_tar, long addr, long addr1, long addr2)
{
long bytes;
int i, bytes1;
char src_buffer[16384];
int op_type;
long cur_addr = addr + addr1;
CrLf = 0;
i = fseek (fd_src, addr1, SEEK_SET);
bytes = (addr2 - addr1 + 1) & (~3);
while (bytes > 0)
{
bytes1 = (bytes <= 16384) ? bytes : 16384;
bytes -= bytes1;
i = fread ( src_buffer, 1, bytes1, fd_src);
if (i > 0)
{
//Dis-asm from src_buffer[0] , bytes1 bytes
for (i = 0; i < bytes1; i += 4)
{
if (m_Radio1)
{
op_type = dis_arm_one ( (unsigned char ) src_buffer[i],
(unsigned char ) src_buffer[i+1],
(unsigned char ) src_buffer[i+2],
(unsigned char ) src_buffer[i+3]);
do_dis_arm (fd_src, fd_tar, cur_addr, addr, op_type,
(unsigned char) src_buffer[i],
(unsigned char) src_buffer[i+1],
(unsigned char) src_buffer[i+2],
(unsigned char) src_buffer[i+3]);
}
else
{
op_type = dis_arm_one ( (unsigned char ) src_buffer[i+3],
(unsigned char ) src_buffer[i+2],
(unsigned char ) src_buffer[i+1],
(unsigned char ) src_buffer[i]);
do_dis_arm (fd_src, fd_tar, cur_addr, addr, op_type,
(unsigned char) src_buffer[i+3],
(unsigned char) src_buffer[i+2],
(unsigned char) src_buffer[i+1],
(unsigned char) src_buffer[i]);
}
cur_addr += 4;
}
}
}
if (CrLf)
CrLf = 0;
else
fwrite ("\n", 1, 1, fd_tar);
return 0;
}
int CUnasmARMDlg::dis_thumb (FILE * fd_src, FILE * fd_tar, long addr, long addr1, long addr2)
{
int i, j, i_delta;
long bytes;
int bytes1;
int remains;
char temp, src_buffer[16384];
int op_type;
long cur_addr = addr + addr1;
CrLf = 0;
i = fseek (fd_src, addr1, SEEK_SET);
bytes = (addr2 - addr1 + 1) & (~1);
remains = 0;
while (bytes > 0)
{
bytes1 = (bytes <= 16384) ? bytes : 16384;
if (remains && (bytes1 > 16382) )
bytes1 -= remains;
bytes -= bytes1;
i = fread ( &src_buffer[remains], 1, bytes1, fd_src);
if (i > 0)
{
if (!m_Radio1)
{
for (j = 0; j < bytes1; j += 2)
{
temp = src_buffer[j];
src_buffer[j] = src_buffer[j+1];
src_buffer[j+1] = temp;
}
}
//Dis-asm from src_buffer[0] , (bytes1+remains) bytes
for (i = 0; i < bytes1 + remains; i += i_delta)
{
op_type = dis_thumb_one ( (unsigned char *) & src_buffer[i]);
if (op_type != 19)
{
i_delta = 2;
do_dis_thumb (fd_src, fd_tar, cur_addr,
addr, op_type,
(unsigned char) src_buffer[i],
(unsigned char) src_buffer[i+1]);
cur_addr += 2;
}
else
{
i_delta = 4;
if ( (bytes1 + remains - i) < 4)
{
remains = 2;
src_buffer[0] = src_buffer[i];
src_buffer[1] = src_buffer[i+1];
break;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -