SHARE
TWEET

GCHQ VM implementation C++

xedarius Dec 4th, 2011 145 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // gchq_vm.cpp
  2. //
  3. // (c) 2011 Rich Carless
  4.  
  5.  
  6. #include "stdafx.h"
  7. #include <iostream>
  8.  
  9. using namespace std;
  10.  
  11. /*
  12. //--------------------------------------------------------------------------------------------------
  13. //
  14. // stage 2 of 3
  15. //
  16. // challenge:
  17. //   reveal the solution within VM.mem
  18. //
  19. // disclaimer:
  20. //   tested in ie 9, firefox 6, chrome 14 and v8 shell (http://code.google.com/apis/v8/build.html),
  21. //   other javascript implementations may or may not work.
  22. //
  23. //--------------------------------------------------------------------------------------------------
  24.  
  25. var VM = {
  26.  
  27.   cpu: {
  28.     ip: 0x00,
  29.    
  30.     r0: 0x00,
  31.     r1: 0x00,
  32.     r2: 0x00,
  33.     r3: 0x00,
  34.    
  35.     cs: 0x00,
  36.     ds: 0x10,
  37.    
  38.     fl: 0x00,
  39.    
  40.     firmware: [0xd2ab1f05, 0xda13f110]
  41.   },
  42.  
  43.   mem: [
  44.     0x31, 0x04, 0x33, 0xaa, 0x40, 0x02, 0x80, 0x03, 0x52, 0x00, 0x72, 0x01, 0x73, 0x01, 0xb2, 0x50,
  45.     0x30, 0x14, 0xc0, 0x01, 0x80, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  46.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  47.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  48.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  49.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  50.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  51.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  52.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  53.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  54.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  55.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  56.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  57.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  58.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  59.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  60.    
  61.     0x98, 0xab, 0xd9, 0xa1, 0x9f, 0xa7, 0x83, 0x83, 0xf2, 0xb1, 0x34, 0xb6, 0xe4, 0xb7, 0xca, 0xb8,
  62.     0xc9, 0xb8, 0x0e, 0xbd, 0x7d, 0x0f, 0xc0, 0xf1, 0xd9, 0x03, 0xc5, 0x3a, 0xc6, 0xc7, 0xc8, 0xc9,
  63.     0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
  64.     0xda, 0xdb, 0xa9, 0xcd, 0xdf, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
  65.     0x26, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
  66.     0x7d, 0x1f, 0x15, 0x60, 0x4d, 0x4d, 0x52, 0x7d, 0x0e, 0x27, 0x6d, 0x10, 0x6d, 0x5a, 0x06, 0x56,
  67.     0x47, 0x14, 0x42, 0x0e, 0xb6, 0xb2, 0xb2, 0xe6, 0xeb, 0xb4, 0x83, 0x8e, 0xd7, 0xe5, 0xd4, 0xd9,
  68.     0xc3, 0xf0, 0x80, 0x95, 0xf1, 0x82, 0x82, 0x9a, 0xbd, 0x95, 0xa4, 0x8d, 0x9a, 0x2b, 0x30, 0x69,
  69.     0x4a, 0x69, 0x65, 0x55, 0x1c, 0x7b, 0x69, 0x1c, 0x6e, 0x04, 0x74, 0x35, 0x21, 0x26, 0x2f, 0x60,
  70.     0x03, 0x4e, 0x37, 0x1e, 0x33, 0x54, 0x39, 0xe6, 0xba, 0xb4, 0xa2, 0xad, 0xa4, 0xc5, 0x95, 0xc8,
  71.     0xc1, 0xe4, 0x8a, 0xec, 0xe7, 0x92, 0x8b, 0xe8, 0x81, 0xf0, 0xad, 0x98, 0xa4, 0xd0, 0xc0, 0x8d,
  72.     0xac, 0x22, 0x52, 0x65, 0x7e, 0x27, 0x2b, 0x5a, 0x12, 0x61, 0x0a, 0x01, 0x7a, 0x6b, 0x1d, 0x67,
  73.     0x75, 0x70, 0x6c, 0x1b, 0x11, 0x25, 0x25, 0x70, 0x7f, 0x7e, 0x67, 0x63, 0x30, 0x3c, 0x6d, 0x6a,
  74.     0x01, 0x51, 0x59, 0x5f, 0x56, 0x13, 0x10, 0x43, 0x19, 0x18, 0xe5, 0xe0, 0xbe, 0xbf, 0xbd, 0xe9,
  75.     0xf0, 0xf1, 0xf9, 0xfa, 0xab, 0x8f, 0xc1, 0xdf, 0xcf, 0x8d, 0xf8, 0xe7, 0xe2, 0xe9, 0x93, 0x8e,
  76.     0xec, 0xf5, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  77.    
  78.     0x37, 0x7a, 0x07, 0x11, 0x1f, 0x1d, 0x68, 0x25, 0x32, 0x77, 0x1e, 0x62, 0x23, 0x5b, 0x47, 0x55,
  79.     0x53, 0x30, 0x11, 0x42, 0xf6, 0xf1, 0xb1, 0xe6, 0xc3, 0xcc, 0xf8, 0xc5, 0xe4, 0xcc, 0xc0, 0xd3,
  80.     0x85, 0xfd, 0x9a, 0xe3, 0xe6, 0x81, 0xb5, 0xbb, 0xd7, 0xcd, 0x87, 0xa3, 0xd3, 0x6b, 0x36, 0x6f,
  81.     0x6f, 0x66, 0x55, 0x30, 0x16, 0x45, 0x5e, 0x09, 0x74, 0x5c, 0x3f, 0x29, 0x2b, 0x66, 0x3d, 0x0d,
  82.     0x02, 0x30, 0x28, 0x35, 0x15, 0x09, 0x15, 0xdd, 0xec, 0xb8, 0xe2, 0xfb, 0xd8, 0xcb, 0xd8, 0xd1,
  83.     0x8b, 0xd5, 0x82, 0xd9, 0x9a, 0xf1, 0x92, 0xab, 0xe8, 0xa6, 0xd6, 0xd0, 0x8c, 0xaa, 0xd2, 0x94,
  84.     0xcf, 0x45, 0x46, 0x67, 0x20, 0x7d, 0x44, 0x14, 0x6b, 0x45, 0x6d, 0x54, 0x03, 0x17, 0x60, 0x62,
  85.     0x55, 0x5a, 0x4a, 0x66, 0x61, 0x11, 0x57, 0x68, 0x75, 0x05, 0x62, 0x36, 0x7d, 0x02, 0x10, 0x4b,
  86.     0x08, 0x22, 0x42, 0x32, 0xba, 0xe2, 0xb9, 0xe2, 0xd6, 0xb9, 0xff, 0xc3, 0xe9, 0x8a, 0x8f, 0xc1,
  87.     0x8f, 0xe1, 0xb8, 0xa4, 0x96, 0xf1, 0x8f, 0x81, 0xb1, 0x8d, 0x89, 0xcc, 0xd4, 0x78, 0x76, 0x61,
  88.     0x72, 0x3e, 0x37, 0x23, 0x56, 0x73, 0x71, 0x79, 0x63, 0x7c, 0x08, 0x11, 0x20, 0x69, 0x7a, 0x14,
  89.     0x68, 0x05, 0x21, 0x1e, 0x32, 0x27, 0x59, 0xb7, 0xcf, 0xab, 0xdd, 0xd5, 0xcc, 0x97, 0x93, 0xf2,
  90.     0xe7, 0xc0, 0xeb, 0xff, 0xe9, 0xa3, 0xbf, 0xa1, 0xab, 0x8b, 0xbb, 0x9e, 0x9e, 0x8c, 0xa0, 0xc1,
  91.     0x9b, 0x5a, 0x2f, 0x2f, 0x4e, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  92.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  93.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  94.   ],
  95.  
  96.   exec: function()
  97.   {
  98.     // virtual machine architecture
  99.     // ++++++++++++++++++++++++++++
  100.     //
  101.     // segmented memory model with 16-byte segment size (notation seg:offset)
  102.     //
  103.     // 4 general-purpose registers (r0-r3)
  104.     // 2 segment registers (cs, ds equiv. to r4, r5)
  105.     // 1 flags register (fl)
  106.     //
  107.     // instruction encoding
  108.     // ++++++++++++++++++++
  109.     //
  110.     //           byte 1               byte 2 (optional)
  111.     // bits      [ 7 6 5 4 3 2 1 0 ]  [ 7 6 5 4 3 2 1 0 ]
  112.     // opcode      - - -            
  113.     // mod               -          
  114.     // operand1            - - - -
  115.     // operand2                         - - - - - - - -
  116.     //
  117.     // operand1 is always a register index
  118.     // operand2 is optional, depending upon the instruction set specified below
  119.     // the value of mod alters the meaning of any operand2
  120.     //   0: operand2 = reg ix
  121.     //   1: operand2 = fixed immediate value or target segment (depending on instruction)
  122.     //
  123.     // instruction set
  124.     // +++++++++++++++
  125.     //
  126.     // Notes:
  127.     //   * r1, r2 => operand 1 is register 1, operand 2 is register 2
  128.     //   * movr r1, r2 => move contents of register r2 into register r1
  129.     //
  130.     // opcode | instruction | operands (mod 0) | operands (mod 1)
  131.     // -------+-------------+------------------+-----------------
  132.     // 0x00   | jmp         | r1               | r2:r1
  133.     // 0x01   | movr        | r1, r2           | rx,   imm
  134.     // 0x02   | movm        | r1, [ds:r2]      | [ds:r1], r2
  135.     // 0x03   | add         | r1, r2           | r1,   imm
  136.     // 0x04   | xor         | r1, r2           | r1,   imm
  137.     // 0x05   | cmp         | r1, r2           | r1,   imm
  138.     // 0x06   | jmpe        | r1               | r2:r1
  139.     // 0x07   | hlt         | N/A              | N/A
  140.     //
  141.     // flags
  142.     // +++++
  143.     //
  144.     // cmp r1, r2 instruction results in:
  145.     //   r1 == r2 => fl = 0
  146.     //   r1 < r2  => fl = 0xff
  147.     //   r1 > r2  => fl = 1
  148.     //
  149.     // jmpe r1
  150.     //   => if (fl == 0) jmp r1
  151.     //      else nop
  152.    
  153.     throw "VM.exec not yet implemented";
  154.   }
  155.  
  156. };
  157.  
  158. //--------------------------------------------------------------------------------------------------
  159.  
  160. try
  161. {
  162.   VM.exec();
  163. }
  164. catch(e)
  165. {
  166.   alert('\nError: ' + e + '\n');
  167. }
  168.  
  169. //--------------------------------------------------------------------------------------------------
  170. */
  171.  
  172.  
  173. unsigned char program[] = {
  174.            0x31, 0x04, 0x33, 0xaa, 0x40, 0x02, 0x80, 0x03, 0x52, 0x00, 0x72, 0x01, 0x73, 0x01, 0xb2, 0x50,
  175.     0x30, 0x14, 0xc0, 0x01, 0x80, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  176.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  177.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  178.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  179.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  180.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  181.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  182.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  183.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  184.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  185.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  186.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  187.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  188.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  189.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  190.    
  191.     0x98, 0xab, 0xd9, 0xa1, 0x9f, 0xa7, 0x83, 0x83, 0xf2, 0xb1, 0x34, 0xb6, 0xe4, 0xb7, 0xca, 0xb8,
  192.     0xc9, 0xb8, 0x0e, 0xbd, 0x7d, 0x0f, 0xc0, 0xf1, 0xd9, 0x03, 0xc5, 0x3a, 0xc6, 0xc7, 0xc8, 0xc9,
  193.     0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
  194.     0xda, 0xdb, 0xa9, 0xcd, 0xdf, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
  195.     0x26, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
  196.     0x7d, 0x1f, 0x15, 0x60, 0x4d, 0x4d, 0x52, 0x7d, 0x0e, 0x27, 0x6d, 0x10, 0x6d, 0x5a, 0x06, 0x56,
  197.     0x47, 0x14, 0x42, 0x0e, 0xb6, 0xb2, 0xb2, 0xe6, 0xeb, 0xb4, 0x83, 0x8e, 0xd7, 0xe5, 0xd4, 0xd9,
  198.     0xc3, 0xf0, 0x80, 0x95, 0xf1, 0x82, 0x82, 0x9a, 0xbd, 0x95, 0xa4, 0x8d, 0x9a, 0x2b, 0x30, 0x69,
  199.     0x4a, 0x69, 0x65, 0x55, 0x1c, 0x7b, 0x69, 0x1c, 0x6e, 0x04, 0x74, 0x35, 0x21, 0x26, 0x2f, 0x60,
  200.     0x03, 0x4e, 0x37, 0x1e, 0x33, 0x54, 0x39, 0xe6, 0xba, 0xb4, 0xa2, 0xad, 0xa4, 0xc5, 0x95, 0xc8,
  201.     0xc1, 0xe4, 0x8a, 0xec, 0xe7, 0x92, 0x8b, 0xe8, 0x81, 0xf0, 0xad, 0x98, 0xa4, 0xd0, 0xc0, 0x8d,
  202.     0xac, 0x22, 0x52, 0x65, 0x7e, 0x27, 0x2b, 0x5a, 0x12, 0x61, 0x0a, 0x01, 0x7a, 0x6b, 0x1d, 0x67,
  203.     0x75, 0x70, 0x6c, 0x1b, 0x11, 0x25, 0x25, 0x70, 0x7f, 0x7e, 0x67, 0x63, 0x30, 0x3c, 0x6d, 0x6a,
  204.     0x01, 0x51, 0x59, 0x5f, 0x56, 0x13, 0x10, 0x43, 0x19, 0x18, 0xe5, 0xe0, 0xbe, 0xbf, 0xbd, 0xe9,
  205.     0xf0, 0xf1, 0xf9, 0xfa, 0xab, 0x8f, 0xc1, 0xdf, 0xcf, 0x8d, 0xf8, 0xe7, 0xe2, 0xe9, 0x93, 0x8e,
  206.     0xec, 0xf5, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  207.    
  208.     0x37, 0x7a, 0x07, 0x11, 0x1f, 0x1d, 0x68, 0x25, 0x32, 0x77, 0x1e, 0x62, 0x23, 0x5b, 0x47, 0x55,
  209.     0x53, 0x30, 0x11, 0x42, 0xf6, 0xf1, 0xb1, 0xe6, 0xc3, 0xcc, 0xf8, 0xc5, 0xe4, 0xcc, 0xc0, 0xd3,
  210.     0x85, 0xfd, 0x9a, 0xe3, 0xe6, 0x81, 0xb5, 0xbb, 0xd7, 0xcd, 0x87, 0xa3, 0xd3, 0x6b, 0x36, 0x6f,
  211.     0x6f, 0x66, 0x55, 0x30, 0x16, 0x45, 0x5e, 0x09, 0x74, 0x5c, 0x3f, 0x29, 0x2b, 0x66, 0x3d, 0x0d,
  212.     0x02, 0x30, 0x28, 0x35, 0x15, 0x09, 0x15, 0xdd, 0xec, 0xb8, 0xe2, 0xfb, 0xd8, 0xcb, 0xd8, 0xd1,
  213.     0x8b, 0xd5, 0x82, 0xd9, 0x9a, 0xf1, 0x92, 0xab, 0xe8, 0xa6, 0xd6, 0xd0, 0x8c, 0xaa, 0xd2, 0x94,
  214.     0xcf, 0x45, 0x46, 0x67, 0x20, 0x7d, 0x44, 0x14, 0x6b, 0x45, 0x6d, 0x54, 0x03, 0x17, 0x60, 0x62,
  215.     0x55, 0x5a, 0x4a, 0x66, 0x61, 0x11, 0x57, 0x68, 0x75, 0x05, 0x62, 0x36, 0x7d, 0x02, 0x10, 0x4b,
  216.     0x08, 0x22, 0x42, 0x32, 0xba, 0xe2, 0xb9, 0xe2, 0xd6, 0xb9, 0xff, 0xc3, 0xe9, 0x8a, 0x8f, 0xc1,
  217.     0x8f, 0xe1, 0xb8, 0xa4, 0x96, 0xf1, 0x8f, 0x81, 0xb1, 0x8d, 0x89, 0xcc, 0xd4, 0x78, 0x76, 0x61,
  218.     0x72, 0x3e, 0x37, 0x23, 0x56, 0x73, 0x71, 0x79, 0x63, 0x7c, 0x08, 0x11, 0x20, 0x69, 0x7a, 0x14,
  219.     0x68, 0x05, 0x21, 0x1e, 0x32, 0x27, 0x59, 0xb7, 0xcf, 0xab, 0xdd, 0xd5, 0xcc, 0x97, 0x93, 0xf2,
  220.     0xe7, 0xc0, 0xeb, 0xff, 0xe9, 0xa3, 0xbf, 0xa1, 0xab, 0x8b, 0xbb, 0x9e, 0x9e, 0x8c, 0xa0, 0xc1,
  221.     0x9b, 0x5a, 0x2f, 0x2f, 0x4e, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  222.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  223.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  224. };
  225.  
  226. class CPU
  227. {        
  228.         enum INSTRUCTION_SET
  229.         {
  230.                 jmp,
  231.                 movr,
  232.                 movm,
  233.                 add,
  234.                 xor,
  235.                 cmp,
  236.                 jmpe,
  237.                 hlt
  238.         };
  239.  
  240.         enum REGISTERS
  241.         {
  242.                 r0,r1,r2,r3,cs,ds
  243.         };
  244.  
  245.         int ip;
  246.         unsigned char reg[6];
  247.         int fl;
  248.  
  249.         unsigned char *program_base;
  250.  
  251.         struct instruction
  252.         {
  253.                 unsigned char op1:4;
  254.                 unsigned char mod:1;
  255.                 unsigned char opcode:3;
  256.                 unsigned char op2:8;
  257.         };
  258.  
  259. public:
  260.  
  261.         CPU() : ip(0),fl(0)
  262.         {
  263.                 memset(reg,0,sizeof(unsigned char) * 6);
  264.                 reg[ds]=0x10;
  265.         }
  266.  
  267.         void SetProgram(unsigned char *in_pbase)
  268.         {
  269.                 program_base = in_pbase;
  270.         }
  271.  
  272.         void Execute()
  273.         {
  274.                 while(1)
  275.                 {
  276.                         instruction *i = (instruction*)&program_base[(reg[cs] << 4) | ip];
  277.  
  278.                         switch(i->opcode)
  279.                         {
  280.                         case jmp:
  281.                 // 0x00   | jmp         | r1               | r2:r1
  282.                                 ip = reg[i->op1];
  283.                                 if( i->mod != 0 )
  284.                                 {
  285.                                         reg[cs] = i->op2;
  286.                                 }
  287.                                 break;
  288.                         case movr:
  289.             // 0x01   | movr        | r1, r2           | rx,   imm
  290.                                 if( i->mod == 0 )
  291.                                 {
  292.                                         reg[i->op1] = reg[i->op2];
  293.                                 }
  294.                                 else
  295.                                 {
  296.                                         reg[i->op1]= i->op2;
  297.                                 }
  298.                                 ip+=2;
  299.                                 break;
  300.    
  301.                         case movm:
  302.                 // 0x02   | movm        | r1, [ds:r2]      | [ds:r1], r2
  303.                                 if( i->mod == 0 )
  304.                                 {
  305.                                         reg[i->op1] = program_base[ (reg[ds] << 4) | reg[i->op2] ];
  306.                                 }
  307.                                 else
  308.                                 {
  309.                                         program_base[ (reg[ds] << 4) | reg[i->op1] ] = reg[i->op2];
  310.                                 }
  311.                                 ip+=2;
  312.                                 break;
  313.                         case add:
  314.                 // 0x03   | add         | r1, r2           | r1,   imm
  315.                                 if( i->mod == 0 )
  316.                                 {
  317.                                         reg[i->op1] += reg[i->op2];
  318.                                 }
  319.                                 else
  320.                                 {
  321.                                         reg[i->op1] += i->op2;
  322.                                 }
  323.                                 ip+=2;
  324.                                 break;
  325.                         case xor:
  326.                 // 0x04   | xor         | r1, r2           | r1,   imm
  327.                                 if( i->mod == 0 )
  328.                                 {
  329.                                         reg[i->op1] ^= reg[i->op2];
  330.                                 }
  331.                                 else
  332.                                 {
  333.                                         reg[i->op1] ^= i->op2;
  334.                                 }
  335.                                 ip+=2;
  336.                                 break;
  337.                         case cmp:
  338.                                 {
  339.                                         int a,b;
  340.                 // 0x05   | cmp         | r1, r2           | r1,   imm
  341.                 // cmp r1, r2 instruction results in:
  342.                 //   r1 == r2 => fl = 0
  343.                 //   r1 < r2  => fl = 0xff
  344.                 //   r1 > r2  => fl = 1
  345.                 //
  346.                 // jmpe r1
  347.                 //   => if (fl == 0) jmp r1
  348.                 //      else nop
  349.                                         a = reg[i->op1];
  350.  
  351.                                         if( i->mod == 0 )
  352.                                         {
  353.                                                 b = reg[i->op2];
  354.                                         }
  355.                                         else
  356.                                         {
  357.                                                 b = i->op2;
  358.                                         }
  359.  
  360.                                         fl = 0;
  361.                                         if( a < b ) fl = 0xff;
  362.                                         else if( a > b ) fl = 0x1;
  363.                                         ip+=2;
  364.                                 }
  365.                                 break;
  366.                         case jmpe:
  367.                 // 0x06   | jmpe        | r1               | r2:r1
  368.                                 if( fl == 0 )
  369.                                 {
  370.                                         ip = reg[i->op1];
  371.                                         if( i->mod != 0 )
  372.                                         {
  373.                                                 reg[cs] = i->op2;
  374.                                         }
  375.                                 }
  376.                                 else
  377.                                 {
  378.                                         ip += 1 + i->mod;
  379.                                 }
  380.                                 break;
  381.                         case hlt:
  382.                                 break;
  383.  
  384.                         default:
  385.                                 cout << "unknown instruction at : " << ip << " opcode : " << i->opcode << endl;
  386.                                 return;
  387.                         }
  388.  
  389.                 }
  390.         }
  391. };
  392.  
  393. int _tmain(int argc, _TCHAR* argv[])
  394. {
  395.         CPU cpu;
  396.  
  397.         cpu.SetProgram(program);
  398.         cpu.Execute();
  399.         return 0;
  400. }
  401.  
  402.  
RAW Paste Data
Top