haxor 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -0
- data/bin/hcc +21 -3
- data/bin/hld +5 -0
- data/bin/hvm +21 -2
- data/lib/haxor.rb +1 -0
- data/lib/haxor/consts.rb +1 -1
- data/lib/haxor/vm/core.rb +4 -2
- data/lib/haxor/vm/cpu/unit/arithmetic.rb +7 -21
- data/lib/haxor/vm/cpu/unit/jumps.rb +11 -16
- data/lib/haxor/vm/registers.rb +42 -0
- data/lib/haxor/vm/stack.rb +4 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 293f0584494d168aa8bfe9d97871fc62fd11936b
|
4
|
+
data.tar.gz: 2a06187130337634f8a271d8d9a869928792919a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef117dfbef1487268cf206d24dfd89aefcc909f9c8702c6e1502edbb9b2c498b023bb57fd89d73508278238a0c52a509f79d6dc240ea67143a2035bf31d6eccd
|
7
|
+
data.tar.gz: c853651c044c0d7c53a1b465b9116a0d33b919f14ccbb55f38e5eff02b9975c02db0f344f0b6c97fa98ec16925750547b2645f86939801cfc80010562c802db4
|
data/README.md
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
# Haxor VM
|
2
|
+
[](https://badge.fury.io/rb/haxor)
|
3
|
+
[](https://codeclimate.com/github/krzysztof-magosa/haxor)
|
4
|
+
|
2
5
|
Haxor consists of compiler _hcc_, linker _hld_ and virtual machine _hvm_.
|
3
6
|
_hcc_ translates asm-like code into tokens, _hld_ links them into bytecode, while _hvm_ runs it.
|
4
7
|
|
@@ -405,6 +408,7 @@ Generates random integer from specified range.
|
|
405
408
|
Arguments:
|
406
409
|
* minimum (inclusive)
|
407
410
|
* maximum (inclusive)
|
411
|
+
|
408
412
|
Generated number is pushed onto stack.
|
409
413
|
```
|
410
414
|
mov sc, 04h
|
data/bin/hcc
CHANGED
@@ -1,10 +1,28 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
|
3
3
|
require_relative '../lib/haxor'
|
4
|
+
require 'optparse'
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
parser = OptionParser.new do |opts|
|
7
|
+
opts.banner = 'Usage: hcc [options] [file.hax]'
|
8
|
+
|
9
|
+
opts.on_tail('-h', '--help', 'Show this message') do
|
10
|
+
puts opts
|
11
|
+
exit
|
12
|
+
end
|
13
|
+
|
14
|
+
opts.on_tail('-v', '--version', 'Show version') do
|
15
|
+
puts "Haxor, version #{Haxor::Consts::GEM_VERSION}, version id #{Haxor::Consts::VERSION}."
|
16
|
+
exit
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
parser.parse!
|
21
|
+
|
22
|
+
if ARGV.empty?
|
23
|
+
puts 'You must specify .hax file to be compiled.'
|
24
|
+
puts parser
|
25
|
+
exit
|
8
26
|
end
|
9
27
|
|
10
28
|
source = File.absolute_path ARGV[0]
|
data/bin/hld
CHANGED
@@ -19,6 +19,11 @@ parser = OptionParser.new do |opts|
|
|
19
19
|
puts opts
|
20
20
|
exit
|
21
21
|
end
|
22
|
+
|
23
|
+
opts.on_tail('-v', '--version', 'Show version') do
|
24
|
+
puts "Haxor, version #{Haxor::Consts::GEM_VERSION}, version id #{Haxor::Consts::VERSION}."
|
25
|
+
exit
|
26
|
+
end
|
22
27
|
end
|
23
28
|
|
24
29
|
parser.parse!
|
data/bin/hvm
CHANGED
@@ -2,9 +2,28 @@
|
|
2
2
|
|
3
3
|
require_relative '../lib/haxor'
|
4
4
|
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
parser = OptionParser.new do |opts|
|
8
|
+
opts.banner = 'Usage: hvm [options] [file.hax.e]'
|
9
|
+
|
10
|
+
opts.on_tail('-h', '--help', 'Show this message') do
|
11
|
+
puts opts
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
15
|
+
opts.on_tail('-v', '--version', 'Show version') do
|
16
|
+
puts "Haxor, version #{Haxor::Consts::GEM_VERSION}, version id #{Haxor::Consts::VERSION}."
|
17
|
+
exit
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
parser.parse!
|
22
|
+
|
5
23
|
if ARGV[0].nil?
|
6
|
-
puts
|
7
|
-
|
24
|
+
puts 'You must specify .hax.e file to be run.'
|
25
|
+
puts parser
|
26
|
+
exit
|
8
27
|
end
|
9
28
|
|
10
29
|
vm = Haxor::Vm::Core.new
|
data/lib/haxor.rb
CHANGED
@@ -12,6 +12,7 @@ require_relative 'haxor/vm/subsystem'
|
|
12
12
|
require_relative 'haxor/vm/mem'
|
13
13
|
require_relative 'haxor/vm/stack'
|
14
14
|
require_relative 'haxor/vm/os'
|
15
|
+
require_relative 'haxor/vm/registers'
|
15
16
|
require_relative 'haxor/vm/cpu/core'
|
16
17
|
require_relative 'haxor/vm/cpu/unit/base'
|
17
18
|
require_relative 'haxor/vm/cpu/unit/logical'
|
data/lib/haxor/consts.rb
CHANGED
data/lib/haxor/vm/core.rb
CHANGED
@@ -9,9 +9,11 @@ module Haxor
|
|
9
9
|
register_subsystem :mem, Mem.new(Consts::RESERVED_MEM)
|
10
10
|
register_subsystem :stack, Stack.new
|
11
11
|
register_subsystem :os, Os.new
|
12
|
+
register_subsystem :registers, Registers.new
|
12
13
|
|
13
14
|
subsystem(:cpu).labels.each do |_, label|
|
14
15
|
subsystem(:mem).add_label label.label, label.absolute_addr
|
16
|
+
subsystem(:registers).add_register label.label, label.absolute_addr
|
15
17
|
end
|
16
18
|
|
17
19
|
@units = []
|
@@ -43,10 +45,10 @@ module Haxor
|
|
43
45
|
|
44
46
|
exe = exe[@hdr.size..-1] # cut off header
|
45
47
|
subsystem(:mem).replace_region Consts::RESERVED_MEM, exe
|
46
|
-
subsystem(:
|
48
|
+
subsystem(:registers).write 'ip', @hdr.entry_point # instruction pointer
|
47
49
|
subsystem(:mem).enlarge @hdr.bss_size
|
48
50
|
subsystem(:mem).enlarge @hdr.stack_size
|
49
|
-
subsystem(:
|
51
|
+
subsystem(:registers).write 'sp', subsystem(:mem).size
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
@@ -38,16 +38,16 @@ module Haxor
|
|
38
38
|
def op_div
|
39
39
|
a = operand
|
40
40
|
av = @vm.subsystem(:mem).read a
|
41
|
-
arv = @vm.subsystem(:
|
42
|
-
@vm.subsystem(:
|
43
|
-
@vm.subsystem(:
|
41
|
+
arv = @vm.subsystem(:registers).read 'ar'
|
42
|
+
@vm.subsystem(:registers).write 'ar', (arv / av)
|
43
|
+
@vm.subsystem(:registers).write 'dr', (arv % av)
|
44
44
|
end
|
45
45
|
|
46
46
|
def op_mul
|
47
47
|
a = operand
|
48
48
|
av = @vm.subsystem(:mem).read a
|
49
|
-
arv = @vm.subsystem(:
|
50
|
-
@vm.subsystem(:
|
49
|
+
arv = @vm.subsystem(:registers).read 'ar'
|
50
|
+
@vm.subsystem(:registers).write 'ar', (arv * av)
|
51
51
|
end
|
52
52
|
|
53
53
|
def op_inc
|
@@ -67,23 +67,9 @@ module Haxor
|
|
67
67
|
av = @vm.subsystem(:mem).read a
|
68
68
|
bv = @vm.subsystem(:mem).read b
|
69
69
|
v = av - bv
|
70
|
-
fr_set Consts::FR_ZERO, (v == 0)
|
71
|
-
fr_set Consts::FR_SIGN, v < 0
|
72
|
-
end
|
73
|
-
|
74
|
-
def fr_set(b, enable)
|
75
|
-
flags = fetch_cell 'fr'
|
76
|
-
if enable
|
77
|
-
flags |= b
|
78
|
-
else
|
79
|
-
flags &= ~b
|
80
|
-
end
|
81
|
-
replace_cell 'fr', flags
|
82
|
-
end
|
83
70
|
|
84
|
-
|
85
|
-
|
86
|
-
(flags & b) > 0
|
71
|
+
@vm.subsystem(:registers).flag Consts::FR_ZERO, v == 0
|
72
|
+
@vm.subsystem(:registers).flag Consts::FR_SIGN, v < 0
|
87
73
|
end
|
88
74
|
end
|
89
75
|
end
|
@@ -37,11 +37,6 @@ module Haxor
|
|
37
37
|
bind_opcode OP_IRET, :op_iret
|
38
38
|
end
|
39
39
|
|
40
|
-
def fr_if(b)
|
41
|
-
flags = fetch_cell 'fr'
|
42
|
-
(flags & b) > 0
|
43
|
-
end
|
44
|
-
|
45
40
|
def op_call
|
46
41
|
a = operand
|
47
42
|
@vm.subsystem(:stack).push 'ip'
|
@@ -55,52 +50,52 @@ module Haxor
|
|
55
50
|
|
56
51
|
def op_je
|
57
52
|
a = operand
|
58
|
-
jmp a if
|
53
|
+
jmp a if @vm.subsystem(:registers).check_flag Consts::FR_ZERO
|
59
54
|
end
|
60
55
|
|
61
56
|
def op_jg
|
62
57
|
a = operand
|
63
|
-
jmp a if
|
58
|
+
jmp a if !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
|
64
59
|
end
|
65
60
|
|
66
61
|
def op_jge
|
67
62
|
a = operand
|
68
|
-
jmp a if
|
63
|
+
jmp a if !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
|
69
64
|
end
|
70
65
|
|
71
66
|
def op_jl
|
72
67
|
a = operand
|
73
|
-
jmp a if
|
68
|
+
jmp a if !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && @vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
|
74
69
|
end
|
75
70
|
|
76
71
|
def op_jle
|
77
72
|
a = operand
|
78
|
-
jmp a if
|
73
|
+
jmp a if @vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
|
79
74
|
end
|
80
75
|
|
81
76
|
def op_jne
|
82
77
|
a = operand
|
83
|
-
jmp a unless
|
78
|
+
jmp a unless @vm.subsystem(:registers).check_flag Consts::FR_ZERO
|
84
79
|
end
|
85
80
|
|
86
81
|
def op_jng
|
87
82
|
a = operand
|
88
|
-
jmp a unless
|
83
|
+
jmp a unless !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
|
89
84
|
end
|
90
85
|
|
91
86
|
def op_jnge
|
92
87
|
a = operand
|
93
|
-
jmp a unless
|
88
|
+
jmp a unless !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
|
94
89
|
end
|
95
90
|
|
96
91
|
def op_jnl
|
97
92
|
a = operand
|
98
|
-
jmp a unless
|
93
|
+
jmp a unless !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && @vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
|
99
94
|
end
|
100
95
|
|
101
96
|
def op_jnle
|
102
97
|
a = operand
|
103
|
-
jmp a unless
|
98
|
+
jmp a unless @vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
|
104
99
|
end
|
105
100
|
|
106
101
|
def op_ret
|
@@ -114,7 +109,7 @@ module Haxor
|
|
114
109
|
private
|
115
110
|
|
116
111
|
def jmp(addr)
|
117
|
-
@vm.subsystem(:
|
112
|
+
@vm.subsystem(:registers).write 'ip', addr
|
118
113
|
end
|
119
114
|
end
|
120
115
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Haxor
|
2
|
+
module Vm
|
3
|
+
class Registers < Subsystem
|
4
|
+
def initialize
|
5
|
+
@registers = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def flag(flag, enabled)
|
9
|
+
flags = read 'fr'
|
10
|
+
if enabled
|
11
|
+
flags |= flag
|
12
|
+
else
|
13
|
+
flags &= ~flag
|
14
|
+
end
|
15
|
+
write 'fr', flags
|
16
|
+
end
|
17
|
+
|
18
|
+
def check_flag(flag)
|
19
|
+
flags = read 'fr'
|
20
|
+
(flags & flag) > 0
|
21
|
+
end
|
22
|
+
|
23
|
+
def read(register)
|
24
|
+
addr = resolve register
|
25
|
+
@vm.subsystem(:mem).read addr
|
26
|
+
end
|
27
|
+
|
28
|
+
def write(register, value)
|
29
|
+
addr = resolve register
|
30
|
+
@vm.subsystem(:mem).write addr, value
|
31
|
+
end
|
32
|
+
|
33
|
+
def resolve(register)
|
34
|
+
@registers[register]
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_register(register, addr)
|
38
|
+
@registers[register] = addr
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/haxor/vm/stack.rb
CHANGED
@@ -7,9 +7,9 @@ module Haxor
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def push_value(value)
|
10
|
-
sp = @vm.subsystem(:
|
10
|
+
sp = @vm.subsystem(:registers).read 'sp'
|
11
11
|
sp -= Consts::WORD_SIZE
|
12
|
-
@vm.subsystem(:
|
12
|
+
@vm.subsystem(:registers).write 'sp', sp
|
13
13
|
@vm.subsystem(:mem).write sp, value
|
14
14
|
end
|
15
15
|
|
@@ -19,10 +19,10 @@ module Haxor
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def pop_value
|
22
|
-
sp = @vm.subsystem(:
|
22
|
+
sp = @vm.subsystem(:registers).read 'sp'
|
23
23
|
value = @vm.subsystem(:mem).read sp
|
24
24
|
sp += Consts::WORD_SIZE
|
25
|
-
@vm.subsystem(:
|
25
|
+
@vm.subsystem(:registers).write 'sp', sp
|
26
26
|
|
27
27
|
value
|
28
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haxor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Krzysztof Magosa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- lib/haxor/vm/cpu/unit/various.rb
|
92
92
|
- lib/haxor/vm/mem.rb
|
93
93
|
- lib/haxor/vm/os.rb
|
94
|
+
- lib/haxor/vm/registers.rb
|
94
95
|
- lib/haxor/vm/stack.rb
|
95
96
|
- lib/haxor/vm/subsystem.rb
|
96
97
|
- media/memory.png
|