1
0
Fork 0

Issue #852 add bswap command (#856)

* defined 'bswap' command as cbInstrBswap.  seems to work when the dest var is a register or user-defined var.  address args fail.

* rewrote bswap to use StringUtils::sprintf formatting.

* removed debug prints from byteswap func.  added error message when parsed arg isn't a variable.

* formatted.
This commit is contained in:
bloodwrath 2016-07-17 06:53:15 -04:00 committed by Duncan Ogilvie
parent a3cc839d42
commit c32eefa4dd
3 changed files with 32 additions and 0 deletions

View File

@ -858,6 +858,36 @@ CMDRESULT cbInstrPop(int argc, char* argv[])
return STATUS_CONTINUE;
}
CMDRESULT cbInstrBswap(int argc, char* argv[])
{
if(argc < 2)
{
dputs("not enough arguments!");
return STATUS_ERROR;
}
duint arg1 = 0;
int size = 0;
bool isvar = false;
if(!valfromstring(argv[1], &arg1, false, false, &size, &isvar))
return STATUS_ERROR;
if(!isvar)
{
dprintf("Invalid expression: \"%s\"", argv[1]);
return STATUS_ERROR;
}
duint result = arg1;
if(size == 2)
result = _byteswap_ushort((uint16)arg1);
else if(size == 4)
result = _byteswap_ulong((uint32)arg1);
#ifdef _WIN64
else if(size == 8)
result = _byteswap_uint64(arg1);
#endif
String swapcmd = StringUtils::sprintf("mov %s, " fhex, argv[1], result);
return cmddirectexec(swapcmd.c_str());
}
CMDRESULT cbInstrRefinit(int argc, char* argv[])
{
GuiReferenceInitialize("Script");

View File

@ -46,6 +46,7 @@ CMDRESULT cbInstrTest(int argc, char* argv[]);
CMDRESULT cbInstrXor(int argc, char* argv[]);
CMDRESULT cbInstrPush(int argc, char* argv[]);
CMDRESULT cbInstrPop(int argc, char* argv[]);
CMDRESULT cbInstrBswap(int argc, char* argv[]);
CMDRESULT cbInstrRefinit(int argc, char* argv[]);
CMDRESULT cbInstrRefadd(int argc, char* argv[]);

View File

@ -261,6 +261,7 @@ static void registercommands()
dbgcmdnew("xor", cbInstrXor, false);
dbgcmdnew("push", cbInstrPush, true);
dbgcmdnew("pop", cbInstrPop, true);
dbgcmdnew("bswap", cbInstrBswap, true);
//script
dbgcmdnew("scriptload", cbScriptLoad, false);