Hasm Assembly

This page describes the format for Hasm assembly files. Hasm files can be disassembled from HBC files and assembled back into HBC files as well using the hasmer command line.

Version Declaration

All Hasm files begin with a version declaration.

Format:

.hasm <version: int> <mode: "auto" | "exact">

Example:

.hasm 84 auto

The version is an integer representing the HBC version that the file is written for.

The mode tells the (dis)assembler how to interpret instructions with variants.

Data Declaration

Hermes instructions often reference constant data, such as the Array Buffer. Data declarations are used to define the data referenced by those instructions.

Format:

.data <type: "A" | "K" | "V"><label: int> <type: "Integer" | "String" | "Null" | "True" | "False" | "Number">[v1, v2, ...]

Example:

.data A351 String["username", "password"]

The data defined within the square brackets must match the data type of the type specification.

Function Declaration

Functions represent compiled JavaScript functions containing Hermes bytecode.

Format:

.start <type: "Function" | "Constructor" | "NCFunction"> <<name: String>>(this, par1, par2, ...)
    declaration1
    declaration2
    ...

    instruction1
    instruction2
    ...
.end

Example:

.start Function <myFuncName>(this)
    .id 263
    .params 1
    .registers 1
    .symbols 0
    .strict

    LoadConstUndefined r0
    Ret r0
.end

Function ID Declaration

Every function, including closures, need a unique ID. This is ID set with the ID declaration.

Format:

.id <id: int>

Example:

.id 263

Function Parameters Declaration

The parameters declaration defines how many parameters a function takes (including the this parameter, which every function takes).

Format:

.params <params: int>

Example:

.params 1

Function Registers Declaration

The registers declaration defines how many registers the function uses.

Format:

.registers <registers: int>

Example:

.registers 1

Function Symbols Declaration

The symbols declaration defines how many slots should be allocated for the function’s Environment.

Format:

.symbols <symbols: int>

Example:

.symbols 1

Function Strict Declaration

The strict declaration declares whether the function should be interpreted in strict mode or not.

Format:

.strict