1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
   | #include <windows.h> #include <iostream> #include <stdint.h>
  uint8_t mem[] =  {     0xE0, 0xE1, 0x01, 0xEF, 0xA3, 0x01, 0x91, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x00, 0xF0, 0xEF, 0xA3,      0x01, 0x91, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0xF0, 0xEF, 0xA3, 0x01, 0x91, 0x00, 0x02, 0x00,      0x08, 0x00, 0x00, 0xF0, 0xEF, 0x19, 0x00, 0xEF, 0xAB, 0x01, 0x80, 0x01, 0x00, 0xEF, 0x0E, 0x00,      0xEF, 0xB7, 0x01, 0x81, 0x00, 0x03, 0x00, 0xEF, 0x92, 0x01, 0xF0, 0xEF, 0x03, 0x00, 0x80, 0x01,      0x00, 0xEF, 0x0E, 0x00, 0xEF, 0xB7, 0x01, 0x81, 0x00, 0x04, 0x00, 0xEF, 0x92, 0x01, 0xF0, 0xEF,      0x19, 0x00, 0xEF, 0xAB, 0x01, 0x80, 0x01, 0x00, 0xEF, 0x0E, 0x00, 0xEF, 0xAB, 0x01, 0x18, 0x00,      0x01, 0x81, 0x00, 0x03, 0x00, 0xEF, 0x92, 0x01, 0xF0, 0xEF, 0x19, 0x00, 0xEF, 0xAB, 0x01, 0x08,      0x01, 0x00, 0xEF, 0x0E, 0x00, 0xEF, 0xB7, 0x01, 0x81, 0x00, 0x03, 0x00, 0xEF, 0x92, 0x01, 0xF0,      0xEF, 0x19, 0x00, 0xEF, 0xAB, 0x01, 0x80, 0x01, 0x00, 0xEF, 0x0E, 0x00, 0x48, 0x00, 0xEF, 0xAB,      0x01, 0x90, 0x01, 0x00, 0x4C, 0x00, 0xEF, 0xB7, 0x01, 0x81, 0x00, 0x03, 0x00, 0xEF, 0x92, 0x01,      0xF0, 0xEF, 0x19, 0x00, 0xEF, 0xAB, 0x01, 0x80, 0x01, 0x00, 0xEF, 0x0E, 0x00, 0x48, 0x00, 0xEF,      0xAB, 0x01, 0xA0, 0x00, 0x01, 0x80, 0x01, 0x00, 0x4C, 0x00, 0xEF, 0xB7, 0x01, 0x81, 0x00, 0x03,      0x00, 0xEF, 0x92, 0x01, 0xF0, 0xEF, 0x19, 0x00, 0xEF, 0xAB, 0x01, 0x80, 0x01, 0x00, 0xEF, 0x0E,      0x00, 0x48, 0x00, 0xEF, 0xAB, 0x01, 0xB0, 0x01, 0x00, 0x4C, 0x00, 0xEF, 0xB7, 0x01, 0x81, 0x00,      0x03, 0x00, 0xEF, 0x92, 0x01, 0xF0, 0xEF, 0x19, 0x00, 0xEF, 0xAB, 0x01, 0x80, 0x01, 0x00, 0xEF,      0x0E, 0x00, 0xEF, 0xAB, 0x01, 0x28, 0x00, 0x01, 0xEC, 0x02, 0x01, 0x81, 0x01, 0x01, 0x00, 0xE0,      0x05, 0x01, 0xB0, 0x01, 0x01, 0x81, 0x00, 0x0E, 0x00, 0xEF, 0xB7, 0x01, 0x81, 0x00, 0x03, 0x00,      0xEF, 0x92, 0x01, 0xF0, 0x81, 0x00, 0x0E, 0x00, 0xEF, 0xAB, 0x01, 0x29, 0x00, 0x01, 0x00, 0xE8,      0x36, 0x01, 0xEF, 0xA3, 0x01, 0x91, 0x00, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x81, 0x00, 0x0F, 0x00,      0xEF, 0xB7, 0x01, 0xE0, 0x3D, 0x01, 0x81, 0x00, 0x03, 0x00, 0xEF, 0x92, 0x01, 0xF0, 0xB0, 0x00,      0x00, 0xEF, 0xAB, 0x01, 0x80, 0x01, 0x00, 0x81, 0x00, 0x01, 0x00, 0xEF, 0xAB, 0x01, 0x80, 0x02,      0x00, 0x81, 0x00, 0x01, 0x00, 0xFC, 0x80, 0x01, 0x00, 0x81, 0x00, 0x00, 0x00, 0xEF, 0xB7, 0x01,      0x81, 0x00, 0x01, 0x00, 0xEF, 0x92, 0x01, 0xF0, 0xB0, 0x00, 0x00, 0xEF, 0xAB, 0x01, 0x80, 0x01,      0x00, 0x81, 0x00, 0x01, 0x00, 0xEF, 0xAB, 0x01, 0x80, 0x02, 0x00, 0x81, 0x00, 0x00, 0x00, 0xFC,      0x80, 0x01, 0x00, 0x81, 0x00, 0x00, 0x00, 0xEF, 0xB7, 0x01, 0x81, 0x00, 0x01, 0x00, 0xEF, 0x92,      0x01, 0xF0, 0x80, 0x01, 0x00, 0xEF, 0xA3, 0x01, 0x90, 0x01, 0x00, 0x81, 0x00, 0x0F, 0x00, 0xEF,      0xB7, 0x01, 0xF0, 0x81, 0x00, 0x0F, 0x00, 0xEF, 0xAB, 0x01, 0xF0, 0xC1, 0x00, 0x02, 0x00, 0x91,      0x00, 0x00, 0x0A, 0x0A, 0x00, 0x00, 0xF0, 0xC1, 0x00, 0x02, 0x00, 0x91, 0x00, 0x00, 0x0A, 0x1A,      0x00, 0x01, 0xF0, 0xEF, 0xA3, 0x01, 0x08, 0x00, 0x00, 0x29, 0x00, 0x0B, 0x00, 0xE8, 0xE0, 0x01,      0xC1, 0x00, 0x02, 0x00, 0x91, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x00, 0xEE, 0x00, 0xE0, 0xC3, 0x01,      0xF0, 0x81, 0x00, 0x0F, 0x00, 0x81, 0x01, 0x00, 0x0C, 0xEF, 0xB7, 0x01, 0xEF, 0xC3, 0x01, 0xF8 };
  int main() {     int index = 0,ptr = -1,res = 0;     while (1)     {         int code = mem[index];         printf("0x%X  ",index);         if ( code > 0xFC )             break;         switch ( mem[index] )         {         case 0x80u:             printf("mov  reg[%X],reg[%X]\n",mem[index + 1],mem[index + 2]);             index += 3;             break;         case 0x81u:             printf("mov  reg[%X],%X\n",mem[index + 1],((mem[index + 3] << 8) | mem[index + 2]));             index += 4;             break;         case 0x90u:             printf("add  reg[%X],reg[%X]\n",mem[index + 1],mem[index + 2]);             index += 3;             break;         case 0x91u:             printf("add  reg[%X],%X\n",mem[index + 1],(mem[index + 2] | (mem[index + 3] << 8)));             index += 4;             break;         case 0xA0u:             printf("sub  reg[%X],%X\n",mem[index + 1],(mem[index + 2] | (mem[index + 3] << 8)));             index += 3;             break;         case 0x4C:             printf("pop\n");             index += 2;             break;         case 8u:             printf("mov  reg[%X],[reg[%X]]\n",mem[index + 1],mem[index + 2]);             index += 3;             break;         case 0xAu:             printf("mov  reg[%X],word [reg[%X]]\n",mem[index + 1],mem[index + 2]);             index += 3;             break;         case 0x18u:             printf("mov  [reg[%X]],reg[%X]\n",mem[index + 1],mem[index + 2]);             index += 3;             break;         case 0x1Au:             printf("mov  word [reg[%X]],reg[%X]\n",mem[index + 1],mem[index + 2]);             index += 3;             break;         case 0x28u:             printf("cmp  reg[%X],reg[%X]\n",mem[index + 1],mem[index + 2]);             index += 3;             break;         case 0x29u:             printf("cmp  reg[%X],%X\n",mem[index + 1],(mem[index + 2] | (mem[index + 3] << 8)));             index += 3;             break;         case 0xB0u:             printf("xor  reg[%X],reg[%X]\n",mem[index + 1],mem[index + 2]);             index += 3;             break;         case 0xC1u:             printf("mul  reg[%X],%X\n",mem[index + 1],mem[index + 2] | (unsigned __int16)(mem[index + 3] << 8));             index += 4;             break;         case 0xE0u:             printf("jmp  %X\n",mem[index + 1] | (mem[index + 2] << 8));             index += 3;             break;         case 0xE8u:             printf("jnz  %X\n",mem[index + 1] | (mem[index + 2] << 8));             index += 3;             break;         case 0xECu:             printf("jz  %X",mem[index + 1] | (mem[index + 2] << 8));             index += 3;             break;         case 0xEEu:             printf("call  reg[%X]\n",mem[index + 1]);             index += 2;             break;         case 0xEFu:             printf("call sub_%X\n",mem[index + 1] | (mem[index + 2] << 8));             index += 3;             break;         case 0xF0u:             printf("ret\n");             index += 1;             break;         case 0xF8u:             printf("exit\n");                                exit(0);             break;         case 0xFCu:             printf("read or write\n");             ++index;             break;         case 0x48:             printf("push\n");             index += 2;             break;         default:             index += 1;             break;         }              }      }
   |