machine_x86.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <cassert>
  2. #include "machine_x86.h"
  3. // Index registers **** temp solution
  4. static const std::string regNames[] = {
  5. "undef",
  6. "ax", "cx", "dx", "bx",
  7. "sp", "bp", "si", "di",
  8. "es", "cs", "ss", "ds",
  9. "al", "cl", "dl", "bl",
  10. "ah", "ch", "dh", "bh",
  11. "tmp",
  12. "bx+si", "bx+di", "bp+si", "bp+di",
  13. "si", "di", "bp", "bx"
  14. };
  15. /* uint8_t and uint16_t registers */
  16. Machine_X86::Machine_X86()
  17. {
  18. static_assert((sizeof(regNames)/sizeof(std::string))==LAST_REG,
  19. "Reg count not equal number of strings");
  20. }
  21. const std::string &Machine_X86::regName(eReg r)
  22. {
  23. assert(r<(sizeof(regNames)/sizeof(std::string)));
  24. return regNames[r];
  25. }
  26. static const std::string szOps[] =
  27. {
  28. "CBW", "AAA", "AAD", "AAM", "AAS", "ADC", "ADD", "AND",
  29. "BOUND","CALL", "CALL", "CLC", "CLD", "CLI", "CMC", "CMP",
  30. "CMPS", "REPNE CMPS","REPE CMPS","DAA", "DAS", "DEC", "DIV", "ENTER",
  31. "ESC", "HLT", "IDIV", "IMUL", "IN", "INC", "INS", "REP INS",
  32. "INT", "IRET", "JB", "JBE", "JAE", "JA", "JE", "JNE",
  33. "JL", "JGE", "JLE", "JG", "JS", "JNS", "JO", "JNO",
  34. "JP", "JNP", "JCXZ", "JMP", "JMP", "LAHF", "LDS", "LEA",
  35. "LEAVE","LES", "LOCK", "LODS", "REP LODS", "LOOP", "LOOPE","LOOPNE",
  36. "MOV", "MOVS", "REP MOVS", "MUL", "NEG", "NOT", "OR", "OUT",
  37. "OUTS", "REP OUTS", "POP", "POPA", "POPF", "PUSH", "PUSHA","PUSHF",
  38. "RCL", "RCR", "ROL", "ROR", "RET", "RETF", "SAHF", "SAR",
  39. "SHL", "SHR", "SBB", "SCAS", "REPNE SCAS","REPE SCAS", "CWD", "STC",
  40. "STD", "STI", "STOS", "REP STOS", "SUB", "TEST", "WAIT", "XCHG",
  41. "XLAT", "XOR", "INTO", "NOP", "REPNE", "REPE", "MOD"
  42. };
  43. const std::string &Machine_X86::opcodeName(unsigned r)
  44. {
  45. assert(r<(sizeof(szOps)/sizeof(std::string)));
  46. return szOps[r];
  47. }
  48. bool Machine_X86::physicalReg(eReg r)
  49. {
  50. return (r>=rAX) && (r<rTMP);
  51. }