Skip to content

Latest commit

 

History

History
67 lines (59 loc) · 2.47 KB

README.md

File metadata and controls

67 lines (59 loc) · 2.47 KB

agsdiss

Quick-and-dirty AGS Bytecode disassembler, for use in AGS compiler Googletests

The “new” AGS compiler features a lot of Googletests where snippets of AGS code are compiled and the resulting code is recorded in C++ arrays as a sequence of integers. Whenever the compiler changes in such a way that those snippets compile differently, the Googletests will fail and thus alert about this fact.

It is difficult to make sense of the bytecode if you just see the bytes, so here is a disassembler that takes bytes as standard input and writes assembly to standard output.

Here's a typical excerpt of such a Googletest:

    int32_t code[] = {
      36,    6,   38,    0,           36,    7,   51,    0,    // 7
      63,  200,    1,    1,          200,   36,    8,   51,    // 15
       0,   63,    1,    1,            1,    1,   36,    9,    // 23
       6,    2,    4,    3,            2,    3,    2,    1,    // 31
     201,    5,  -999
    };

Feed the text excluding the first line (the line starting with int32_t) as standard input into the disassembler.

Here's the result after disassembling the above:

   0:   sourceline   2
   2:   thisaddr   0
   4:   sourceline   3
   6:   load.sp.offs   8
   8:   memread4   ax
  10:   push    ax
  12:   movl    ax,   0 [float 0]
  15:   pop     bx
  17:   gt      bx,   ax
  20:   mov     bx,   ax
  23:   jzi     7 [to 32]
  25:   sourceline   5
  27:   movl    ax,   1 [float 1.4013e-45]
  30:   jmpi    5 [to 37]
  32:   sourceline   7
  34:   movl    ax,   -1 [float -nan]
  37:   sourceline   7
  39:   ret     
  40:   sourceline   8
  42:   movl    ax,   9 [float 1.26117e-44]
  45:   ret     
  46:   Illegal opcode -999 EXITING

Note: The disassembler will stop at the first error it encounters. Usually, this happens to be the very last -999, which isn't a legal opcode. Don't mind this because the -999 is a sentinel value that's at the end of the array intentionally.

When a Bytecode Googletest fails, the old code that was previously generated is part of the googletest. You can call the Googletest in such a way that the new code is generated to a file. Convert the old code and the new code to assembly format; then use an editor such as Notepad++ to diff the two and highlight the assembly instructions that have changed.

This source code is provided under the Artistic License 2.0. A copy of this license can be found in the file License.txt and at http://www.opensource.org/licenses/artistic-license-2.0.php