bool X86RTLGenerator::parseArgument(x86_op_t *pOp, Argument &aArgument) { if(!pOp) { return false; } switch(pOp->type) { case op_register: { aArgument.setType(Argument::TYPE_REGISTER); std::string strRegisterName = pOp->data.reg.name; if(strRegisterName == "ah") { aArgument.setRegister((Argument::eRegister)REGISTER_X86_EAX); aArgument.setDataWidth(Argument::DATA_WIDTH_8_LW_HB); } else if(strRegisterName == "al") { aArgument.setRegister((Argument::eRegister)REGISTER_X86_EAX); aArgument.setDataWidth(Argument::DATA_WIDTH_8_LW_LB); } else if(strRegisterName == "ax") { aArgument.setRegister((Argument::eRegister)REGISTER_X86_EAX); aArgument.setDataWidth(Argument::DATA_WIDTH_16_LW); } else if(strRegisterName == "eax") { aArgument.setRegister((Argument::eRegister)REGISTER_X86_EAX); aArgument.setDataWidth(Argument::DATA_WIDTH_32); } else if(strRegisterName == "esi") { aArgument.setRegister((Argument::eRegister)REGISTER_X86_ESI); aArgument.setDataWidth(Argument::DATA_WIDTH_32); } else if(strRegisterName == "esp") { aArgument.setRegister((Argument::eRegister)REGISTER_X86_ESP); aArgument.setDataWidth(Argument::DATA_WIDTH_32); } else return false; break; } case op_immediate: aArgument.setType(Argument::TYPE_VALUE); switch(pOp->datatype) { case op_byte: aArgument.setValue(pOp->data.byte); aArgument.setDataWidth(Argument::DATA_WIDTH_8_LW_LB); break; default: return false; } break; case op_expression: aArgument.setType(Argument::TYPE_MEMORY_LOC); break; case op_offset: aArgument.setType(Argument::TYPE_MEMORY_LOC); break; case op_relative_far: aArgument.setType(Argument::TYPE_VALUE); break; case op_relative_near: aArgument.setType(Argument::TYPE_VALUE); break; default: return false; } return true; }