haxor 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +101 -335
- data/bin/{hcc → hc} +1 -9
- data/bin/hvm +13 -8
- data/examples/build.sh +1 -1
- data/examples/guess-the-number.hax +65 -76
- data/lib/haxor.rb +2 -14
- data/lib/haxor/compiler/core.rb +249 -18
- data/lib/haxor/consts.rb +4 -17
- data/lib/haxor/linker.rb +12 -4
- data/lib/haxor/token/cmd.rb +29 -2
- data/lib/haxor/utils.rb +24 -0
- data/lib/haxor/vm/core.rb +6 -9
- data/lib/haxor/vm/cpu/core.rb +214 -83
- data/lib/haxor/vm/mem.rb +1 -36
- data/lib/haxor/vm/os.rb +7 -13
- data/lib/haxor/vm/stack.rb +4 -4
- data/media/memory.png +0 -0
- metadata +5 -19
- data/lib/haxor/compiler/component/arithmetic.rb +0 -45
- data/lib/haxor/compiler/component/base.rb +0 -41
- data/lib/haxor/compiler/component/data.rb +0 -32
- data/lib/haxor/compiler/component/jumps.rb +0 -83
- data/lib/haxor/compiler/component/logical.rb +0 -35
- data/lib/haxor/compiler/component/other.rb +0 -21
- data/lib/haxor/compiler/component/transfer.rb +0 -25
- data/lib/haxor/compiler/component/various.rb +0 -30
- data/lib/haxor/vm/cpu/unit/arithmetic.rb +0 -78
- data/lib/haxor/vm/cpu/unit/base.rb +0 -46
- data/lib/haxor/vm/cpu/unit/jumps.rb +0 -118
- data/lib/haxor/vm/cpu/unit/logical.rb +0 -59
- data/lib/haxor/vm/cpu/unit/transfer.rb +0 -37
- data/lib/haxor/vm/cpu/unit/various.rb +0 -47
- data/media/vm.png +0 -0
@@ -1,25 +0,0 @@
|
|
1
|
-
module Haxor
|
2
|
-
module Compiler
|
3
|
-
module Component
|
4
|
-
class Transfer < Base
|
5
|
-
def register
|
6
|
-
bind_cmd 'mov', :cmd_mov
|
7
|
-
bind_cmd 'push', :cmd_push
|
8
|
-
bind_cmd 'pop', :cmd_pop
|
9
|
-
end
|
10
|
-
|
11
|
-
def cmd_push(a)
|
12
|
-
add_cmd Vm::Cpu::Unit::Transfer::OP_PUSH, a
|
13
|
-
end
|
14
|
-
|
15
|
-
def cmd_pop(a)
|
16
|
-
add_cmd Vm::Cpu::Unit::Transfer::OP_POP, a
|
17
|
-
end
|
18
|
-
|
19
|
-
def cmd_mov(a, b)
|
20
|
-
add_cmd Vm::Cpu::Unit::Transfer::OP_MOV, a, b
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Haxor
|
2
|
-
module Compiler
|
3
|
-
module Component
|
4
|
-
class Various < Base
|
5
|
-
def register
|
6
|
-
bind_cmd 'nop', :cmd_nop
|
7
|
-
bind_cmd 'lea', :cmd_lea
|
8
|
-
bind_cmd 'int', :cmd_int
|
9
|
-
bind_cmd 'syscall', :cmd_syscall
|
10
|
-
end
|
11
|
-
|
12
|
-
def cmd_nop(*_args)
|
13
|
-
add_cmd Vm::Cpu::Unit::Various::OP_NOP
|
14
|
-
end
|
15
|
-
|
16
|
-
def cmd_lea(a, b)
|
17
|
-
add_cmd Vm::Cpu::Unit::Various::OP_LEA, a, b
|
18
|
-
end
|
19
|
-
|
20
|
-
def cmd_int(a)
|
21
|
-
add_cmd Vm::Cpu::Unit::Various::OP_INT, a
|
22
|
-
end
|
23
|
-
|
24
|
-
def cmd_syscall
|
25
|
-
add_cmd Vm::Cpu::Unit::Various::OP_SYSCALL
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
module Haxor
|
2
|
-
module Vm
|
3
|
-
module Cpu
|
4
|
-
module Unit
|
5
|
-
class Arithmetic < Base
|
6
|
-
# 0x00 (not used)
|
7
|
-
OP_ADD = 0x01 # add a, b
|
8
|
-
OP_SUB = 0x02 # sub a, b
|
9
|
-
OP_DIV = 0x03 # div a
|
10
|
-
OP_MUL = 0x04 # mul a
|
11
|
-
OP_INC = 0x05 # inc a
|
12
|
-
OP_DEC = 0x06 # dec a
|
13
|
-
OP_CMP = 0x07 # cmp a, b
|
14
|
-
# 0x1f
|
15
|
-
|
16
|
-
def register
|
17
|
-
bind_opcode OP_ADD, :op_add
|
18
|
-
bind_opcode OP_SUB, :op_sub
|
19
|
-
bind_opcode OP_DIV, :op_div
|
20
|
-
bind_opcode OP_MUL, :op_mul
|
21
|
-
bind_opcode OP_INC, :op_inc
|
22
|
-
bind_opcode OP_DEC, :op_dec
|
23
|
-
bind_opcode OP_CMP, :op_cmp
|
24
|
-
end
|
25
|
-
|
26
|
-
def op_add
|
27
|
-
a, b = operands
|
28
|
-
c = @vm.subsystem(:mem).read(a) + @vm.subsystem(:mem).read(b)
|
29
|
-
@vm.subsystem(:mem).write a, c
|
30
|
-
end
|
31
|
-
|
32
|
-
def op_sub
|
33
|
-
a, b = operands
|
34
|
-
c = @vm.subsystem(:mem).read(a) - @vm.subsystem(:mem).read(b)
|
35
|
-
@vm.subsystem(:mem).write a, c
|
36
|
-
end
|
37
|
-
|
38
|
-
def op_div
|
39
|
-
a = operand
|
40
|
-
av = @vm.subsystem(:mem).read a
|
41
|
-
arv = @vm.subsystem(:registers).read 'ar'
|
42
|
-
@vm.subsystem(:registers).write 'ar', (arv / av)
|
43
|
-
@vm.subsystem(:registers).write 'dr', (arv % av)
|
44
|
-
end
|
45
|
-
|
46
|
-
def op_mul
|
47
|
-
a = operand
|
48
|
-
av = @vm.subsystem(:mem).read a
|
49
|
-
arv = @vm.subsystem(:registers).read 'ar'
|
50
|
-
@vm.subsystem(:registers).write 'ar', (arv * av)
|
51
|
-
end
|
52
|
-
|
53
|
-
def op_inc
|
54
|
-
a = operand
|
55
|
-
av = @vm.subsystem(:mem).read a
|
56
|
-
@vm.subsystem(:mem).write a, (av + 1)
|
57
|
-
end
|
58
|
-
|
59
|
-
def op_dec
|
60
|
-
a = operand
|
61
|
-
av = @vm.subsystem(:mem).read a
|
62
|
-
@vm.subsystem(:mem).write a, (av - 1)
|
63
|
-
end
|
64
|
-
|
65
|
-
def op_cmp
|
66
|
-
a, b = operands
|
67
|
-
av = @vm.subsystem(:mem).read a
|
68
|
-
bv = @vm.subsystem(:mem).read b
|
69
|
-
v = av - bv
|
70
|
-
|
71
|
-
@vm.subsystem(:registers).flag Consts::FR_ZERO, v == 0
|
72
|
-
@vm.subsystem(:registers).flag Consts::FR_SIGN, v < 0
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module Haxor
|
2
|
-
module Vm
|
3
|
-
module Cpu
|
4
|
-
module Unit
|
5
|
-
class Base
|
6
|
-
attr_accessor :vm
|
7
|
-
|
8
|
-
def register
|
9
|
-
fail 'this method must be implemented.'
|
10
|
-
end
|
11
|
-
|
12
|
-
def bind_opcode(opcode, method)
|
13
|
-
@vm.bind_opcode opcode, self, method
|
14
|
-
end
|
15
|
-
|
16
|
-
# TODO: BC
|
17
|
-
def next_cell
|
18
|
-
@vm.subsystem(:mem).next_word
|
19
|
-
end
|
20
|
-
|
21
|
-
# TODO: BC
|
22
|
-
def fetch_cell(addr)
|
23
|
-
@vm.subsystem(:mem).read addr
|
24
|
-
end
|
25
|
-
|
26
|
-
def dereference(addr)
|
27
|
-
@vm.subsystem(:mem).read addr
|
28
|
-
end
|
29
|
-
|
30
|
-
# TODO: BC
|
31
|
-
def replace_cell(addr, value)
|
32
|
-
@vm.subsystem(:mem).write addr, value
|
33
|
-
end
|
34
|
-
|
35
|
-
def operand
|
36
|
-
@vm.operand
|
37
|
-
end
|
38
|
-
|
39
|
-
def operands
|
40
|
-
@vm.operands
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,118 +0,0 @@
|
|
1
|
-
module Haxor
|
2
|
-
module Vm
|
3
|
-
module Cpu
|
4
|
-
module Unit
|
5
|
-
class Jumps < Base
|
6
|
-
# 0x20
|
7
|
-
OP_CALL = 0x20 # call a
|
8
|
-
OP_JMP = 0x21 # jmp a
|
9
|
-
OP_JE = 0x22 # je a
|
10
|
-
OP_JG = 0x23 # jg a
|
11
|
-
OP_JGE = 0x24 # jge a
|
12
|
-
OP_JL = 0x25 # jl a
|
13
|
-
OP_JLE = 0x26 # jle a
|
14
|
-
OP_JNE = 0x27 # jne a
|
15
|
-
OP_JNG = 0x28 # jng a
|
16
|
-
OP_JNGE = 0x29 # jnge a
|
17
|
-
OP_JNL = 0x2a # jnl a
|
18
|
-
OP_JNLE = 0x2b # jnle a
|
19
|
-
OP_RET = 0x2c # ret
|
20
|
-
OP_IRET = 0x2d # iret
|
21
|
-
# 0x3f
|
22
|
-
|
23
|
-
def register
|
24
|
-
bind_opcode OP_CALL, :op_call
|
25
|
-
bind_opcode OP_JMP, :op_jmp
|
26
|
-
bind_opcode OP_JE, :op_je
|
27
|
-
bind_opcode OP_JG, :op_jg
|
28
|
-
bind_opcode OP_JGE, :op_jge
|
29
|
-
bind_opcode OP_JL, :op_jl
|
30
|
-
bind_opcode OP_JLE, :op_jle
|
31
|
-
bind_opcode OP_JNE, :op_jne
|
32
|
-
bind_opcode OP_JNG, :op_jng
|
33
|
-
bind_opcode OP_JNGE, :op_jnge
|
34
|
-
bind_opcode OP_JNL, :op_jnl
|
35
|
-
bind_opcode OP_JNLE, :op_jnle
|
36
|
-
bind_opcode OP_RET, :op_ret
|
37
|
-
bind_opcode OP_IRET, :op_iret
|
38
|
-
end
|
39
|
-
|
40
|
-
def op_call
|
41
|
-
a = operand
|
42
|
-
@vm.subsystem(:stack).push 'ip'
|
43
|
-
jmp a
|
44
|
-
end
|
45
|
-
|
46
|
-
def op_jmp
|
47
|
-
a = operand
|
48
|
-
jmp a
|
49
|
-
end
|
50
|
-
|
51
|
-
def op_je
|
52
|
-
a = operand
|
53
|
-
jmp a if @vm.subsystem(:registers).check_flag Consts::FR_ZERO
|
54
|
-
end
|
55
|
-
|
56
|
-
def op_jg
|
57
|
-
a = operand
|
58
|
-
jmp a if !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
|
59
|
-
end
|
60
|
-
|
61
|
-
def op_jge
|
62
|
-
a = operand
|
63
|
-
jmp a if !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
|
64
|
-
end
|
65
|
-
|
66
|
-
def op_jl
|
67
|
-
a = operand
|
68
|
-
jmp a if !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && @vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
|
69
|
-
end
|
70
|
-
|
71
|
-
def op_jle
|
72
|
-
a = operand
|
73
|
-
jmp a if @vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
|
74
|
-
end
|
75
|
-
|
76
|
-
def op_jne
|
77
|
-
a = operand
|
78
|
-
jmp a unless @vm.subsystem(:registers).check_flag Consts::FR_ZERO
|
79
|
-
end
|
80
|
-
|
81
|
-
def op_jng
|
82
|
-
a = operand
|
83
|
-
jmp a unless !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
|
84
|
-
end
|
85
|
-
|
86
|
-
def op_jnge
|
87
|
-
a = operand
|
88
|
-
jmp a unless !@vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
|
89
|
-
end
|
90
|
-
|
91
|
-
def op_jnl
|
92
|
-
a = operand
|
93
|
-
jmp a unless !@vm.subsystem(:registers).check_flag(Consts::FR_ZERO) && @vm.subsystem(:registers).check_flag(Consts::FR_SIGN)
|
94
|
-
end
|
95
|
-
|
96
|
-
def op_jnle
|
97
|
-
a = operand
|
98
|
-
jmp a unless @vm.subsystem(:registers).check_flag(Consts::FR_SIGN) || @vm.subsystem(:registers).check_flag(Consts::FR_ZERO)
|
99
|
-
end
|
100
|
-
|
101
|
-
def op_ret
|
102
|
-
@vm.subsystem(:stack).pop 'ip'
|
103
|
-
end
|
104
|
-
|
105
|
-
def op_iret
|
106
|
-
@vm.subsystem(:stack).pop 'ip'
|
107
|
-
end
|
108
|
-
|
109
|
-
private
|
110
|
-
|
111
|
-
def jmp(addr)
|
112
|
-
@vm.subsystem(:registers).write 'ip', addr
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
module Haxor
|
2
|
-
module Vm
|
3
|
-
module Cpu
|
4
|
-
module Unit
|
5
|
-
class Logical < Base
|
6
|
-
# 0x40
|
7
|
-
OP_AND = 0x40 # and a, b
|
8
|
-
OP_NEG = 0x41 # neg a
|
9
|
-
OP_NOT = 0x42 # not a
|
10
|
-
OP_OR = 0x43 # or a, b
|
11
|
-
OP_XOR = 0x44 # xor a, b
|
12
|
-
# 0x5f
|
13
|
-
|
14
|
-
def register
|
15
|
-
bind_opcode OP_AND, :op_and
|
16
|
-
bind_opcode OP_NEG, :op_neg
|
17
|
-
bind_opcode OP_NOT, :op_not
|
18
|
-
bind_opcode OP_OR, :op_or
|
19
|
-
bind_opcode OP_XOR, :op_xor
|
20
|
-
end
|
21
|
-
|
22
|
-
def op_and
|
23
|
-
a, b = operands
|
24
|
-
av = @vm.subsystem(:mem).read a
|
25
|
-
bv = @vm.subsystem(:mem).read b
|
26
|
-
v = av & bv
|
27
|
-
@vm.subsystem(:mem).write a, v
|
28
|
-
end
|
29
|
-
|
30
|
-
def op_neg
|
31
|
-
a = operand
|
32
|
-
av = @vm.subsystem(:mem).read a
|
33
|
-
@vm.subsystem(:mem).write a, -av
|
34
|
-
end
|
35
|
-
|
36
|
-
def op_not
|
37
|
-
a = operand
|
38
|
-
av = @vm.subsystem(:mem).read a
|
39
|
-
@vm.subsystem(:mem).write a, ~av
|
40
|
-
end
|
41
|
-
|
42
|
-
def op_or
|
43
|
-
a, b = operands
|
44
|
-
av = @vm.subsystem(:mem).read a
|
45
|
-
bv = @vm.subsystem(:mem).read b
|
46
|
-
@vm.subsystem(:mem).write a, (av | bv)
|
47
|
-
end
|
48
|
-
|
49
|
-
def op_xor
|
50
|
-
a, b = operands
|
51
|
-
av = @vm.subsystem(:mem).read a
|
52
|
-
bv = @vm.subsystem(:mem).read b
|
53
|
-
@vm.subsystem(:mem).write a, (av ^ bv)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Haxor
|
2
|
-
module Vm
|
3
|
-
module Cpu
|
4
|
-
module Unit
|
5
|
-
class Transfer < Base
|
6
|
-
# 0x60
|
7
|
-
OP_MOV = 0x60 # mov a, b
|
8
|
-
OP_PUSH = 0x61 # push a
|
9
|
-
OP_POP = 0x62 # pop a
|
10
|
-
# 0x7f
|
11
|
-
|
12
|
-
def register
|
13
|
-
bind_opcode OP_MOV, :op_mov
|
14
|
-
bind_opcode OP_PUSH, :op_push
|
15
|
-
bind_opcode OP_POP, :op_pop
|
16
|
-
end
|
17
|
-
|
18
|
-
def op_mov
|
19
|
-
a, b = operands
|
20
|
-
v = @vm.subsystem(:mem).read b
|
21
|
-
@vm.subsystem(:mem).write a, v
|
22
|
-
end
|
23
|
-
|
24
|
-
def op_push
|
25
|
-
a = operand
|
26
|
-
@vm.subsystem(:stack).push a
|
27
|
-
end
|
28
|
-
|
29
|
-
def op_pop
|
30
|
-
a = operand
|
31
|
-
@vm.subsystem(:stack).pop a
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Haxor
|
2
|
-
module Vm
|
3
|
-
module Cpu
|
4
|
-
module Unit
|
5
|
-
class Various < Base
|
6
|
-
# = 0x80
|
7
|
-
OP_LEA = 0x80 # lea a
|
8
|
-
OP_NOP = 0x81 # nop
|
9
|
-
OP_INT = 0x85 # int a
|
10
|
-
OP_SYSCALL = 0x86 # syscall
|
11
|
-
# 0x9f
|
12
|
-
|
13
|
-
def register
|
14
|
-
bind_opcode OP_LEA, :op_lea
|
15
|
-
bind_opcode OP_NOP, :op_nop
|
16
|
-
bind_opcode OP_INT, :op_int
|
17
|
-
bind_opcode OP_SYSCALL, :op_syscall
|
18
|
-
end
|
19
|
-
|
20
|
-
def op_lea
|
21
|
-
a, b = operands
|
22
|
-
@vm.subsystem(:mem).write a, b
|
23
|
-
end
|
24
|
-
|
25
|
-
def op_nop
|
26
|
-
# intentionally nothing here
|
27
|
-
end
|
28
|
-
|
29
|
-
def op_int
|
30
|
-
a = operand
|
31
|
-
|
32
|
-
@vm.subsystem(:stack).push 'ip'
|
33
|
-
|
34
|
-
av = @vm.subsystem(:mem).read a
|
35
|
-
ivt = Consts::IVT_ADDR + (av * 8)
|
36
|
-
handler = @vm.subsystem(:mem).read ivt
|
37
|
-
@vm.subsystem(:mem).write 'ip', handler
|
38
|
-
end
|
39
|
-
|
40
|
-
def op_syscall
|
41
|
-
@vm.subsystem(:os).syscall
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|