0.1.31 • Published 4 years ago

hasm v0.1.31

Weekly downloads
109
License
-
Repository
-
Last release
4 years ago

HASM

Right now this package is designed to only work on 64bit Windows, I plan to make it work on Linux eventually, and if all goes well other other platforms as well.

I have only tested it on Intel CPU, but it should work fine on AMD CPUs as well, also I'm only testing this package on node v11.0.0, but older versions should work as well.

This package is heavy work in progress, expect things to not work correctly and compatibility to be broken often.

Disclaimer

This package compiles code directly to "runtime" ASM, this means that it has raw access to the CPU, it can do anything you can do in compiled languages such as C, C++ etc... this means that it can cause a lot of issues, basically it can do anything, so there is no guarantee that it is be stable or safe to use.

I'm not responsible for any damage this package can cause.

License

I haven't decided on the license for the package yet, right now you can use anything as if it were public domain, not that there is much anyway, but this will change in the future and there will be a proper license.

How to use

For all of the example I will be using TypeScript.

So let's start with an example.

import { Native, ASMBuilder, VarType, JumpType } from "hasm";
const CodeArray = Native.ExecutableArrayBuffer(1 << 24);
const CodeContainer = new Uint8Array(CodeArray);

let retRegister = 0;
let arg0 = 1;
let arg1 = 2;

let temp5 = 15;

let asm = new ASMBuilder();
let exitLabel = asm.label(); // create a label for :loop
let loopLabel = asm.label(); // create a label for :exit

asm.clear(VarType.Int, retRegister); // clear return register
asm.move(VarType.Int, temp5, arg1); // move int from arg1 to temp5

asm.testAnd(VarType.Int, temp5); // setup AND test for temp5
asm.jump(JumpType.JZ, exitLabel); // if temp5 === 0 jump to :exit
loopLabel.here(); // :loop
asm.add(VarType.Int, retRegister, arg0); // arg0++
asm.decrement(VarType.Int, temp5); // temp5--
asm.jump(JumpType.JNZ, loopLabel); // if temp5 !== 0 jump to :loop
exitLabel.here(); // :exit
asm.return(); // return

// convert the function to bytes
let bytes = asm.asBytes();
// copy function bytes to the executable array CodeContainer
CodeContainer.set(bytes, 0);

// execute function from CodeContainer at offset 0 with arguments 1, 10000
let ret = Native.Execute(CodeArray, 0, 1, 10000); // 10000
console.log(ret); // 10000
0.1.31

4 years ago

0.1.30

4 years ago

0.1.29

4 years ago

0.1.28

4 years ago

0.1.27

4 years ago

0.1.26

4 years ago

0.1.25

4 years ago

0.1.24

4 years ago

0.1.23

4 years ago

0.1.21

4 years ago

0.1.22

4 years ago

0.1.20

4 years ago

0.1.19

4 years ago

0.1.18

4 years ago

0.1.15

4 years ago

0.1.16

4 years ago

0.1.17

4 years ago

0.1.14

4 years ago

0.1.13

5 years ago

0.1.12

5 years ago

0.1.11

5 years ago

0.1.10

5 years ago

0.1.9

5 years ago

0.1.8

5 years ago

0.1.7

5 years ago

0.1.6

5 years ago

0.1.5

5 years ago

0.1.4

5 years ago

0.1.3

5 years ago

0.1.2

5 years ago

0.1.1

5 years ago

0.1.0

5 years ago

0.0.4

6 years ago

0.0.3

6 years ago

0.0.2

6 years ago

0.0.1

6 years ago