haxor 0.1.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.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +27 -0
  6. data/README.md +414 -0
  7. data/Rakefile +1 -0
  8. data/bin/hcc +21 -0
  9. data/bin/hld +38 -0
  10. data/bin/hvm +17 -0
  11. data/examples/build.sh +10 -0
  12. data/examples/guess-the-number.hax +100 -0
  13. data/haxor.gemspec +24 -0
  14. data/lib/haxor.rb +44 -0
  15. data/lib/haxor/compiler/component/arithmetic.rb +55 -0
  16. data/lib/haxor/compiler/component/base.rb +37 -0
  17. data/lib/haxor/compiler/component/data.rb +32 -0
  18. data/lib/haxor/compiler/component/jumps.rb +95 -0
  19. data/lib/haxor/compiler/component/logical.rb +43 -0
  20. data/lib/haxor/compiler/component/other.rb +21 -0
  21. data/lib/haxor/compiler/component/transfer.rb +29 -0
  22. data/lib/haxor/compiler/component/various.rb +33 -0
  23. data/lib/haxor/compiler/core.rb +134 -0
  24. data/lib/haxor/compiler/section.rb +6 -0
  25. data/lib/haxor/compiler/unit.rb +39 -0
  26. data/lib/haxor/consts.rb +28 -0
  27. data/lib/haxor/header.rb +40 -0
  28. data/lib/haxor/linker.rb +89 -0
  29. data/lib/haxor/token/base.rb +7 -0
  30. data/lib/haxor/token/cmd.rb +9 -0
  31. data/lib/haxor/token/data.rb +17 -0
  32. data/lib/haxor/token/int64.rb +17 -0
  33. data/lib/haxor/token/label.rb +23 -0
  34. data/lib/haxor/token/pointer.rb +13 -0
  35. data/lib/haxor/vm/core.rb +53 -0
  36. data/lib/haxor/vm/cpu/core.rb +129 -0
  37. data/lib/haxor/vm/cpu/unit/arithmetic.rb +92 -0
  38. data/lib/haxor/vm/cpu/unit/base.rb +46 -0
  39. data/lib/haxor/vm/cpu/unit/jumps.rb +123 -0
  40. data/lib/haxor/vm/cpu/unit/logical.rb +59 -0
  41. data/lib/haxor/vm/cpu/unit/transfer.rb +37 -0
  42. data/lib/haxor/vm/cpu/unit/various.rb +47 -0
  43. data/lib/haxor/vm/mem.rb +101 -0
  44. data/lib/haxor/vm/os.rb +115 -0
  45. data/lib/haxor/vm/stack.rb +31 -0
  46. data/lib/haxor/vm/subsystem.rb +16 -0
  47. data/media/memory.png +0 -0
  48. data/media/vm.png +0 -0
  49. metadata +122 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 86dcbbd321e0c9f81e94620624119b709967430b
4
+ data.tar.gz: b6aa04aa13522e6de177628276de6f4503913d29
5
+ SHA512:
6
+ metadata.gz: ffa365bb3a8118366f4179e77f10b4723a40c44f7ef2751142336412ada1711bd848958b641740b94f1278b61b18c592bdbde8fbba58bb7649fa736b1b92d887
7
+ data.tar.gz: 5eaeef6044009fe4709d2b85d7cf7a587010233e13106ad640f6c0a0311bd53974bf96ceb68ce5fe79ce4aab560d96e1e904019fa3b556ef3af200ec3e965416
@@ -0,0 +1,11 @@
1
+ /examples/*.hax.u
2
+ /examples/*.hax.e
3
+ /.bundle/
4
+ /.yardoc
5
+ /Gemfile.lock
6
+ /_yardoc/
7
+ /coverage/
8
+ /doc/
9
+ /pkg/
10
+ /spec/reports/
11
+ /tmp/
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.3
4
+ before_install: gem install bundler -v 1.10.5
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in haxor.gemspec
4
+ gemspec
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2015, Krzysztof Magosa
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ * Neither the name of 'Haxor' nor the names of its
15
+ contributors may be used to endorse or promote products derived from
16
+ this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,414 @@
1
+ # Haxor VM
2
+ Haxor consists of compiler _hcc_, linker _hld_ and virtual machine _hvm_.
3
+ _hcc_ translates asm-like code into tokens, _hld_ links them into bytecode, while _hvm_ runs it.
4
+
5
+ ## Man, why have you written that?
6
+ Writing own implementation of VM gives a lot of knowledge about
7
+ computer's architecture. You hit into issues not known during day
8
+ by day activity in high level languages you use. So... just to
9
+ broaden horizons and for fun ;)
10
+
11
+ ## Usage
12
+ Compilation:
13
+ ```
14
+ hcc program.hax
15
+ ```
16
+
17
+ Linking:
18
+ ```
19
+ hld -o program.hax.e program.hax.u
20
+ hld -s 4096 -o program.hax.e program.hax.u # custom stack size
21
+ ```
22
+
23
+ Run:
24
+ ```
25
+ hvm program.hax.e
26
+ ```
27
+
28
+ ## License
29
+ Haxor is licensed under BSD 3-clause license. You can read it [here](LICENSE.txt).
30
+
31
+ ## Architecture
32
+
33
+ <img src="media/vm.png" width="50%">
34
+
35
+ ### General information
36
+ * Little Endian
37
+ * Size of WORD is 64 bit
38
+ * All registers are 64 bit
39
+ * All numbers are signed
40
+ * Memory works in flat model
41
+ * Only integer arithmetic is supported
42
+ * All memory cells are writable
43
+
44
+ ### OpCodes
45
+ OpCode is 64 bit integer. 0-7 bits are used to designate command, 8-63 are used to specify flags.
46
+ Command can take 0, 1 or 2 operands. All operands are 64 bit addresses in memory. Const values
47
+ are pushed into _.data_ section by compiler and pointed by automatically generated labels.
48
+
49
+ ```
50
+ [opcode (command + flags)] [operand1] [operand2]
51
+ ```
52
+
53
+ ### vCPU
54
+ vCPU registers are mapped into lowest memory addresses between 0 and 1024 bytes.
55
+ * _ip_ - instruction pointer
56
+ * _sp_ - stack pointer
57
+ * _bp_ - base pointer
58
+ * _ar_ - arithmetic register I
59
+ * _dr_ - arithmetic register II
60
+ * _fr_ - flags register
61
+ * _sc_ - syscall register
62
+ * _op_ - currently processed opcode
63
+ * _r01-10_ - general usage registres
64
+
65
+ ### Flags register
66
+ Flags register is 64 bit.
67
+ * bit 0 - ZERO (`A-B=0`, so numbers are equal)
68
+ * bit 1 - SIGN (result is negative)
69
+ * rest is reserved for future use
70
+
71
+ ## Memory map
72
+ <img src="media/memory.png" width="50%">
73
+
74
+ ## Language
75
+ Haxor uses primitive asm-like syntax. Each command goes into separate line.
76
+ You can add comments in code, but they also need to be separate lines, beginning
77
+ from _#_ or _rem_.
78
+ For two-argument commands destination goes into first argument while source into second one.
79
+ In some commands you can dereference value by enclosing it in brackets (e.g. `[sp]`).
80
+ Program starts from _main_ label.
81
+
82
+ ```
83
+ command A, B
84
+ ```
85
+
86
+ ## Instructions
87
+ ### Arithmetic
88
+ #### add
89
+ Sums _A_ and _B_, result goes to _A_.
90
+ _A_ or/and _B_ can be dereferenced.
91
+ OpCode: 0x01.
92
+ ```
93
+ add A, B
94
+ ```
95
+
96
+ #### sub
97
+ Subtracts _B_ from _A_, result goes to _A_.
98
+ _A_ or/and _B_ can be dereferenced.
99
+ OpCode: 0x02.
100
+ ```
101
+ sub A, B
102
+ ```
103
+
104
+ #### div
105
+ Divides `ar` register by _A_. Result goes to register. Remainder goes to `dr` register.
106
+ _A_ can be dereferenced.
107
+ OpCode: 0x03.
108
+ ```
109
+ div A
110
+ ```
111
+
112
+ #### mul
113
+ Multiplies `ar` register by _A_. Result goes to register.
114
+ _A_ can be dereferenced.
115
+ OpCode: 0x04.
116
+ ```
117
+ mul A
118
+ ```
119
+
120
+ #### inc
121
+ Increments _A_ by 1.
122
+ _A_ can be dereferenced.
123
+ OpCode: 0x05.
124
+ ```
125
+ inc A
126
+ ```
127
+
128
+ #### dec
129
+ Decrements _A_ by 1.
130
+ _A_ can be dereferenced.
131
+ OpCode: 0x06.
132
+ ```
133
+ dec A
134
+ ```
135
+
136
+ #### cmp
137
+ Compares _A_ with _B_ by subtracting _B_ from _A_ and setting flags register bits.
138
+ _A_ or/and _B_ can be dereferenced.
139
+ OpCode: 0x07.
140
+ ```
141
+ cmp A, B
142
+ ```
143
+
144
+ ### Logical
145
+ #### and
146
+ Performs bitwise AND operation.
147
+ _A_ or/and _B_ can be dereferenced.
148
+ OpCode: 0x40.
149
+ ```
150
+ and A, B
151
+ ```
152
+
153
+ #### neg
154
+ Reverses the sign of number _A_.
155
+ _A_ can be dereferenced.
156
+ OpCode: 0x41.
157
+ ```
158
+ neg A
159
+ ```
160
+
161
+ #### not
162
+ Performs bitwise NOT operation.
163
+ _A_ can be dereferenced.
164
+ OpCode: 0x42.
165
+ ```
166
+ not A
167
+ ```
168
+
169
+ #### or
170
+ Performs bitwise OR operation.
171
+ _A_ or/and _B_ can be dereferenced.
172
+ OpCode: 0x43.
173
+ ```
174
+ or A, B
175
+ ```
176
+
177
+ #### xor
178
+ Performs bitwise XOR operation.
179
+ _A_ or/and _B_ can be dereferenced.
180
+ OpCode: 0x44.
181
+ ```
182
+ xor A, B
183
+ ```
184
+
185
+ ### Transfer
186
+ #### mov
187
+ Moves data from _B_ to _A_.
188
+ _A_ or/and _B_ can be dereferenced.
189
+ OpCode: 0x60.
190
+ ```
191
+ mov A, B
192
+ ```
193
+
194
+ #### push
195
+ Places _A_ on top of stack.
196
+ OpCode: 0x61.
197
+ ```
198
+ push A
199
+ ```
200
+
201
+ #### pop
202
+ Removes element from top of the stack and into _A_.
203
+ OpCode: 0x62.
204
+ ```
205
+ pop A
206
+ ```
207
+
208
+ ### Jumps
209
+ #### call
210
+ Places _ip_ register on the stack and jumps to _A_.
211
+ _A_ can be dereferenced.
212
+ OpCode: 0x20.
213
+ ```
214
+ call A
215
+ ```
216
+
217
+ #### ret
218
+ Pops _ip_ from the stack, and jumps to it.
219
+ OpCode: 0x2c.
220
+ ```
221
+ ret
222
+ ```
223
+
224
+ ### iret
225
+ Comes back from interrupt.
226
+ OpCode: 0x2d.
227
+ ```
228
+ iret
229
+ ```
230
+
231
+ #### jmp
232
+ Performs unconditional jump to _A_.
233
+ _A_ can be dereferenced.
234
+ OpCode: 0x21.
235
+ ```
236
+ jmp A
237
+ ```
238
+
239
+ #### je
240
+ Jumps to _A_ if in _cmp_ _A_ is equal to _B_.
241
+ _A_ can be dereferenced.
242
+ OpCode: 0x22.
243
+ ```
244
+ je A
245
+ ```
246
+
247
+ #### jg
248
+ Jumps to _A_ if in _cmp_ _A_ is greater than _B_.
249
+ _A_ can be dereferenced.
250
+ OpCode: 0x23.
251
+ ```
252
+ jg A
253
+ ```
254
+
255
+ #### jge
256
+ Jumps to _A_ if in _cmp_ _A_ is greater or equal to _B_.
257
+ _A_ can be dereferenced.
258
+ OpCode: 0x24.
259
+ ```
260
+ jge A
261
+ ```
262
+
263
+ #### jl
264
+ Jumps to _A_ if in _cmp_ _A_ is less than _B_.
265
+ _A_ can be dereferenced.
266
+ OpCode: 0x25.
267
+ ```
268
+ jl A
269
+ ```
270
+
271
+ #### jle
272
+ Jumps to _A_ if in _cmp_ _A_ is less or equal to _B_.
273
+ _A_ can be dereferenced.
274
+ OpCode: 0x26.
275
+ ```
276
+ jle A
277
+ ```
278
+
279
+ #### jne
280
+ Jumps to _A_ if in _cmp_ _A_ is not equal to _B_.
281
+ _A_ can be dereferenced.
282
+ OpCode: 0x27.
283
+ ```
284
+ jne A
285
+ ```
286
+
287
+ #### jng
288
+ Jumps to _A_ if in _cmp_ _A_ is not greater than _B_.
289
+ _A_ can be dereferenced.
290
+ OpCode: 0x28.
291
+ ```
292
+ jng A
293
+ ```
294
+
295
+ #### jnge
296
+ Jumps to _A_ if in _cmp_ _A_ is not greater or equal to _B_.
297
+ _A_ can be dereferenced.
298
+ OpCode: 0x29.
299
+ ```
300
+ jnge A
301
+ ```
302
+
303
+ #### jnl
304
+ Jumps to _A_ if in _cmp_ _A_ is not less than _B_.
305
+ _A_ can be dereferenced.
306
+ OpCode: 0x2a.
307
+ ```
308
+ jnl A
309
+ ```
310
+
311
+ #### jnle
312
+ Jumps to _A_ if in _cmp_ _A_ is not less or equal to _B_.
313
+ _A_ can be dereferenced.
314
+ OpCode: 0x2b.
315
+ ```
316
+ jnle A
317
+ ```
318
+
319
+ ### Various
320
+ #### lea
321
+ Pushes address of _B_ into _A_.
322
+ OpCode: 0x80.
323
+ ```
324
+ lea A, B
325
+ ```
326
+
327
+ #### nop
328
+ Does nothing.
329
+ OpCode: 0x81.
330
+ ```
331
+ nop
332
+ ```
333
+
334
+ #### int
335
+ Generate software interrupt with ID specified by _A_.
336
+ _A_ can be dereferenced.
337
+ OpCode: 0x85.
338
+ ```
339
+ int A
340
+ ```
341
+
342
+ #### syscall
343
+ Asks Haxor VM to do "system" call. OpCode: 0x86.
344
+ ```
345
+ syscall
346
+ ```
347
+
348
+ ## System calls
349
+ Using _syscall_ command you can run some system calls provided by Haxor VM.
350
+ System call number is passed via _sc_ register, arguments go via stack in reversed order.
351
+
352
+ ### exit (01h)
353
+ Terminates VM process with specified exit code.
354
+ Takes 1 argument:
355
+ * exit code
356
+ ```
357
+ push 100
358
+ mov sc, 01h
359
+ syscall
360
+ ```
361
+
362
+ ### printf (02h)
363
+ Prints formatted text into file specified by descriptor.
364
+ Takes 2 or more arguments:
365
+ * file descriptor (1 for standard output, 2 for standard error)
366
+ * format string
367
+ * data depending on format string...
368
+ ```
369
+ lea r01, format_text
370
+ push r01
371
+ push 1
372
+ mov sc, 02h
373
+ ```
374
+
375
+ ### scanf (03h)
376
+ Converts data from file specified by descriptor.
377
+ Remember that memory is not automatically
378
+ allocated by this function. You need to prepare
379
+ space before calling this function.
380
+ Use length limits to avoid buffer overflow (e.g. %100s to take up to 100 characters from string).
381
+ In case of string your buffer must have 1 element more for closing '0'.
382
+ Takes 2 or more arguments:
383
+ * file descriptor (0 for standard input)
384
+ * format string
385
+ * addresses in memory to put data into them...
386
+ ```
387
+ section .data
388
+ dw scanfmt, "%100s", 0
389
+
390
+ section .bss
391
+ label name
392
+ resw 101
393
+
394
+ lea r01, name
395
+ push r01
396
+ lea r01, scanfmt
397
+ push r01
398
+ push 0
399
+ mov sc, 03h
400
+ syscall
401
+ ```
402
+
403
+ ### random (04h)
404
+ Generates random integer from specified range.
405
+ Arguments:
406
+ * minimum (inclusive)
407
+ * maximum (inclusive)
408
+ Generated number is pushed onto stack.
409
+ ```
410
+ mov sc, 04h
411
+ push 100
412
+ push 1
413
+ syscall
414
+ ```