Here's an incomplete script to do this, for x86:
#include <idc.idc>
/*
Project name: Pseudo instruction adder 1.0
Author: fastman92
*/
#define true 1
#define false 0
#define ARCHITECTURE_TYPE_X86 1
#define ARCHITECTURE_TYPE_X64 2
extern architectureType;
extern pointerSize;
static MakeInstructionComment_x86(ea)
{
auto mnem = GetMnem(ea);
auto op0 = GetOpnd(ea, 0);
auto op1 = GetOpnd(ea, 1);
auto comment = "";
if(mnem == "push")
comment = sprintf("ESP -= 4; *(int32_t*)ESP = %s;", op0);
else if(mnem == "mov")
comment = sprintf("%s = %s;", op0, op1);
else if(mnem == "lea")
comment = sprintf("%s = address(%s);", op0, op1);
else if(mnem == "jmp")
comment = sprintf("goto %s;", op0);
else if(mnem == "pop")
comment = sprintf("%s = *(int32_t*)ESP; ESP += 4;", op0);
else if(mnem == "leave")
comment = "EBP = *(int32_t*)ESP; ESP += 4;";
else if(mnem == "retn")
comment = "return;";
else if(mnem == "sub")
comment = sprintf("%s -= %s;", op0, op1);
else if(mnem == "shr")
comment = sprintf("%s = %s >> %s;", op0, op0, op1);
else if(mnem == "shl")
comment = sprintf("%s = %s << %s;", op0, op0, op1);
else if(mnem == "and")
comment = sprintf("%s &= %s;", op0, op1);
else if(mnem == "or")
comment = sprintf("%s |= %s;", op0, op1);
else if(mnem == "xor")
comment = sprintf("%s ^= %s;", op0, op1);
else if(mnem == "not")
comment = sprintf("%s = ~%s;", op0, op0);
else if(mnem == "cmp")
comment = sprintf("EFL = cmp(%s, %s);", op0, op1);
else if(mnem == "test")
comment = sprintf("EFL = test(%s, %s);", op0, op1);
else if(mnem == "jnb")
comment = "goto, if A >= B;";
else if(mnem == "jz")
comment = "goto, if A == B;";
else if(mnem == "jnz")
comment = "goto, if A != B;";
else if(mnem == "jb")
comment = "goto, if A < B;";
else if(mnem == "jbe")
comment = "goto, if A <= B;";
else if(mnem == "jl")
comment = "goto, if A < B;";
else if(mnem == "ja")
comment = "goto, if A > B;";
else if(mnem == "js")
comment = "goto, if A < 0;";
else if(mnem == "pusha")
comment = "saveAllGeneralRegisterValues()";
else if(mnem == "popa")
comment = "restoreAllGeneralRegisterValues()";
else if(mnem == "stc")
comment = "setCarryFlag();";
else if(mnem == "clc")
comment = "clearCarryFlag();";
else if(mnem == "cmps")
comment = "memcmp;";
else if(mnem == "movs")
comment = "memset;";
else if(mnem == "nop")
comment = ";";
else if(mnem == "call")
comment = sprintf("call %s", op0);
else if(mnem == "inc")
comment = sprintf("%s++;", op0);
else if(mnem == "dec")
comment = sprintf("%s--;", op0);
else if(mnem == "add")
comment = sprintf("%s += %s;", op0, op1);
else
{
// Message("unknown: 0x%X mnem: %s\n", ea, mnem);
return true;
}
MakeComm(ea, comment);
// Message("0x%X: %s\n", ea, comment);
return true;
}
static MakeInstructionComment(ea)
{
if(architectureType == ARCHITECTURE_TYPE_X86)
return MakeInstructionComment_x86(ea);
}
static main()
{
architectureType = ARCHITECTURE_TYPE_X86;
if(architectureType == ARCHITECTURE_TYPE_X86)
{
pointerSize = 4;
}
Message("Start of pseudo instruction adder by fastman92\n");
auto seg, loc;
Message("========================================\n");
seg = FirstSeg(); // Get address pointed by a first segment
auto shouldBreak = false;
while(seg != BADADDR )
{
Message("----------------------------------------\n");
loc = SegStart(seg);
Message("Adding pseudo code comments in segment %s\n", SegName(seg));
while(loc != BADADDR && loc < SegEnd(seg))
{
if(isCode(GetFlags(loc)))
{
shouldBreak = !MakeInstructionComment(loc);
if(shouldBreak)
break;
}
loc = NextHead(loc, BADADDR);
}
if(shouldBreak)
break;
seg = NextSeg(seg); // get address of the next segment
}
Message("End of pseudo instruction adder by fastman92\n");
}