wilson 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (9) hide show
  1. data.tar.gz.sig +2 -0
  2. data/History.txt +11 -0
  3. data/Manifest.txt +2 -0
  4. data/Rakefile +1 -53
  5. data/bench.rb +128 -0
  6. data/example.rb +216 -0
  7. data/lib/wilson.rb +30 -11
  8. metadata +38 -7
  9. metadata.gz.sig +1 -0
@@ -0,0 +1,2 @@
1
+ c:�gfL���nr��U5�!
2
+ �����7�-�g*�[����"���Wg���m�]�F�����/���v� �]O6�%;�+���Σ=�HD��Dh`I��SA#�6�ҥBA�ѧ|R ��_I6�sr��P�S���:�v�ϕi�K".�P2|2��xҪ���<�]��e�9�������P��n���SQw9�-S����w�~7�_�!R]sK.�#��ۭ��\��KK�$�3�X��7E:����%.B��`
@@ -1,3 +1,14 @@
1
+ === 1.0.1 / 2009-04-22
2
+
3
+ * 3 minor enhancements:
4
+
5
+ * Added bench.rb to demonstrate timings.
6
+ * Added example.rb.
7
+
8
+ * 1 bug fix:
9
+
10
+ * Fixed defasm to work much better.
11
+
1
12
  === 1.0.0 / 2009-01-20
2
13
 
3
14
  * 1 major enhancement
@@ -2,5 +2,7 @@ History.txt
2
2
  Manifest.txt
3
3
  README.txt
4
4
  Rakefile
5
+ bench.rb
6
+ example.rb
5
7
  lib/wilson.rb
6
8
  test/test_wilson.rb
data/Rakefile CHANGED
@@ -4,68 +4,16 @@ require 'rubygems'
4
4
  require 'hoe'
5
5
  require './lib/wilson.rb'
6
6
 
7
- h=Hoe.new('wilson', Wilson::VERSION) do |p|
7
+ Hoe.new('wilson', Wilson::VERSION) do |p|
8
8
  p.rubyforge_name = 'seattlerb'
9
9
  p.developer('Ryan Davis', 'ryand-ruby@zenspider.com')
10
10
  end
11
11
 
12
- class Hoe
13
- def test_cmd flavor = nil
14
- msg = flavor ? :sh : :ruby
15
- tests = ["rubygems", self.testlib] +
16
- test_globs.map { |g| Dir.glob(g) }.flatten
17
- tests.map! {|f| %Q(require "#{f}")}
18
- cmd = "#{RUBY_FLAGS} -e '#{tests.join("; ")}' #{FILTER}"
19
-
20
- ENV['EXCLUDED_VERSIONS'] = multiruby_skip.join(":")
21
-
22
- cmd = "#{flavor} #{cmd}" if flavor
23
-
24
- return msg, cmd
25
- end
26
- end
27
-
28
- # def run_tests(multi=false) # :nodoc:
29
- # msg = multi ? :sh : :ruby
30
- # cmd = if test ?f, 'test/test_all.rb' then
31
- # "#{RUBY_FLAGS} test/test_all.rb #{FILTER}"
32
- # else
33
- # tests = ["rubygems", self.testlib] +
34
- # test_globs.map { |g| Dir.glob(g) }.flatten
35
- # tests.map! {|f| %Q(require "#{f}")}
36
- # "#{RUBY_FLAGS} -e '#{tests.join("; ")}' #{FILTER}"
37
- # end
38
- #
39
- # excludes = multiruby_skip.join(":")
40
- # ENV['EXCLUDED_VERSIONS'] = excludes
41
- # cmd = "multiruby #{cmd}" if multi
42
- #
43
- # send msg, cmd
44
- # end
45
-
46
12
  namespace :test do
47
13
  desc "profiles your tests"
48
14
  task :prof do
49
15
  send(*h.test_cmd(:zenprofile))
50
16
  end
51
-
52
- desc "rcov your tests"
53
- task :rcov do
54
- raise "not yet"
55
- end
56
17
  end
57
18
 
58
- begin
59
- require 'rcov/rcovtask'
60
- Rcov::RcovTask.new do |t|
61
- pattern = ENV['PATTERN'] || 'test/test_*.rb'
62
-
63
- t.test_files = FileList[pattern]
64
- t.verbose = true
65
- t.rcov_opts << "--threshold 80"
66
- t.rcov_opts << "--no-color"
67
- end
68
- rescue LoadError
69
- # skip
70
- end
71
19
  # vim: syntax=Ruby
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/ruby -w
2
+
3
+ # % rm -r ~/.ruby_inline; ./bench.rb 1_000_000 1_000
4
+ # # of iterations = 1000000
5
+ # user system total real
6
+ # null_time 0.130000 0.000000 0.130000 ( 0.123534)
7
+ # c-nil 0.280000 0.000000 0.280000 ( 0.284030)
8
+ # asm-nil 0.270000 0.000000 0.270000 ( 0.278700)
9
+ # c 0.830000 0.010000 0.840000 ( 0.841285)
10
+ # asm2 0.840000 0.000000 0.840000 ( 0.842834)
11
+ # asm 3.510000 0.010000 3.520000 ( 3.543986)
12
+ # ruby 89.790000 0.200000 89.990000 ( 90.653678)
13
+
14
+ $: << 'lib'
15
+ require 'wilson'
16
+ require 'rubygems'
17
+ require 'inline'
18
+ require 'benchmark'
19
+
20
+ max = (ARGV.shift || 10_000_000).to_i
21
+ $n = (ARGV.shift || 10).to_i
22
+
23
+ class Counter
24
+ inline do |builder|
25
+ builder.c "VALUE cee_nil() { return Qnil;}"
26
+ builder.c "long cee() { long i; for (i = 0;i<#{$n};i++) {}; return i;}"
27
+ end
28
+
29
+ # 00000f7a pushl %ebp
30
+ # 00000f7b xorl %eax,%eax
31
+ # 00000f7d movl %esp,%ebp
32
+ # 00000f7f incl %eax
33
+ # 00000f80 cmpl $0x000003e8,%eax
34
+ # 00000f85 jne 0x00000f7f
35
+ # 00000f87 leave
36
+ # 00000f88 movw $0x07d1,%ax
37
+ # 00000f8c ret
38
+
39
+ defasm :asm_nil do
40
+ eax.mov 4
41
+ end
42
+
43
+ defasm :asm do
44
+ eax.mov 0
45
+ ecx.mov $n
46
+ count = self.label
47
+ eax.add 1
48
+ count.loop
49
+
50
+ eax.add eax # fixnum: n + n + 1
51
+ eax.inc
52
+ end
53
+
54
+ # 00000000 55 push ebp
55
+ # 00000001 89E5 mov ebp,esp
56
+ # 00000003 56 push esi
57
+ # 00000004 57 push edi
58
+ # 00000005 B800000000 mov eax,0x0
59
+ # 0000000A B910270000 mov ecx,0x2710
60
+ # 0000000F 83C001 add eax,byte +0x1
61
+ # 00000012 E2FB loop 0xf
62
+ # 00000014 01C0 add eax,eax
63
+ # 00000016 40 inc eax
64
+ # 00000017 5F pop edi
65
+ # 00000018 5E pop esi
66
+ # 00000019 C9 leave
67
+ # 0000001A C3 ret
68
+
69
+ defasm :asm2 do
70
+ eax.mov 0
71
+ count = self.label
72
+ eax.inc
73
+ eax.cmp $n
74
+ jne count
75
+
76
+ eax.add eax # fixnum: n + n + 1
77
+ eax.inc
78
+ end
79
+
80
+ # 00000000 55 push ebp
81
+ # 00000001 89E5 mov ebp,esp
82
+ # 00000003 B800000000 mov eax,0x0
83
+ # 00000008 40 inc eax
84
+ # 00000009 3DE8030000 cmp eax,0x3e8
85
+ # 0000000E 75F8 jnz 0x8
86
+ # 00000010 01C0 add eax,eax
87
+ # 00000012 40 inc eax
88
+ # 00000013 C9 leave
89
+ # 00000014 C3 ret
90
+
91
+ def ruby_nil
92
+ nil
93
+ end
94
+
95
+ def ruby
96
+ $n.times do; end
97
+ end
98
+ end
99
+
100
+ counter = Counter.new
101
+
102
+ raise "bad c_nil" unless counter.cee_nil.nil?
103
+ raise "bad asm_nil" unless counter.asm_nil.nil?
104
+ raise "bad c" unless counter.cee == $n
105
+ raise "bad asm2" unless counter.asm2 == $n
106
+ raise "bad asm" unless counter.asm == $n
107
+ raise "bad ruby" unless counter.ruby == $n
108
+
109
+ puts "# of iterations = #{max}"
110
+ puts "$n = #{$n}"
111
+ puts
112
+ Benchmark::bm(20) do |x|
113
+ x.report("null_time") do
114
+ for i in 0..max do
115
+ # do nothing
116
+ end
117
+ end
118
+
119
+ %w(cee_nil asm_nil ruby_nil cee asm2 asm ruby).each do |name|
120
+ eval "
121
+ x.report(#{name.inspect}) do
122
+ for i in 0..max do
123
+ counter.#{name}
124
+ end
125
+ end
126
+ "
127
+ end
128
+ end
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/ruby -w
2
+
3
+ require 'test/unit'
4
+ $: << 'lib'
5
+ require 'wilson'
6
+
7
+ class Examples
8
+ defasm :count_to_ten do
9
+ eax.mov 0
10
+ ecx.mov 10
11
+ count = self.label
12
+ eax.add 1
13
+ count.loop
14
+
15
+ to_ruby eax
16
+ end
17
+
18
+ defasm :three_plus_four do
19
+ eax.mov 3
20
+ eax.add 4
21
+
22
+ # convert machine fixnum to ruby fixnum. aka: ((x << 1) + 1)
23
+ to_ruby eax
24
+ end
25
+
26
+ defasm :jump_forward do
27
+ future = self.future_label
28
+ eax.xor eax
29
+ future.jmp
30
+ eax.inc
31
+ future.plant
32
+ end
33
+
34
+ defasm :first_in_array, :array do
35
+ # edx.mov array
36
+ # eax.xor eax
37
+ # al.mov edx
38
+ end
39
+
40
+ defasm :add, :a, :b do
41
+ # eax.mov a
42
+ # eax.add b
43
+ end
44
+
45
+ defasm :sum, :array, :len do
46
+ # edx.mov array
47
+ # ecx.mov len
48
+ # ecx.dec
49
+ # eax.xor eax
50
+ # al.add edx
51
+
52
+ # repeat = self.label
53
+ # al.add edx + ecx
54
+ # repeat.loop
55
+ end
56
+ end
57
+
58
+ class TestExamples < Test::Unit::TestCase
59
+ def setup
60
+ warn name
61
+ @x = Examples.new
62
+ end
63
+
64
+ def test_three_plus_four
65
+ assert_equal 7, @x.three_plus_four
66
+ end
67
+
68
+ def test_three_plus_four_again
69
+ assert_equal 7, @x.three_plus_four
70
+ end
71
+
72
+ def test_jump_forward
73
+ assert_equal false, @x.jump_forward
74
+ end
75
+
76
+ def test_three_plus_four_again_again
77
+ assert_equal 7, @x.three_plus_four
78
+ end
79
+
80
+ def test_jump_forward_again
81
+ assert_equal false, @x.jump_forward
82
+ end
83
+
84
+ def test_count_to_ten
85
+ expect = 10
86
+ actual = @x.count_to_ten
87
+ assert_equal expect, actual #
88
+ end
89
+
90
+ def test_add
91
+ # assert_equal 7, @x.add(3, 4)
92
+ end
93
+
94
+ def test_first_in_array
95
+ # array = [5, 6, 7, 8, 9, 100]
96
+ # assert_equal 5, @x.first_in_array(array)
97
+ end
98
+
99
+ def test_sum
100
+ # | array |
101
+ # array = #[ 5 6 7 8 9 100 ] gc_copy_to_heap
102
+ # self assert: (Sum call_with: array with: 5) = 35
103
+ end
104
+ end
105
+
106
+ class ARC4
107
+ # ARC4 API
108
+
109
+ # encryptInPlace: byteArray length: length
110
+ # | array |
111
+ # array = byteArray gcCopyToHeap
112
+ # self encryptArrayOnHeap: array length: length
113
+ # array copyAt: 0 to: byteArray size: length startingAt: 1
114
+
115
+ # encrypt: string
116
+ # | array result |
117
+ # array = string gcCopyToHeap
118
+ # self encryptArrayOnHeap: array length: string size
119
+ # result = ByteArray new: string size
120
+ # array copyAt: 0 to: result size: string size startingAt: 1
121
+ # ^result
122
+
123
+ # setKey: key
124
+ # self s: (Security.ARC4 new setKey: key asByteArray) s i: 0 j: 0
125
+
126
+ # encryptArrayOnHeap: array length: length
127
+ # | args |
128
+ # args = Array new: 5
129
+ # args at: 1 put: array
130
+ # args at: 2 put: length
131
+ # args at: 3 put: s
132
+ # args at: 4 put: i
133
+ # args at: 5 put: j
134
+ # ARC4Encrypt type baseType call: ARC4Encrypt withArguments: args
135
+
136
+ # ARC4 assembler
137
+
138
+ # repeat: times do: aBlock
139
+ # | repeat |
140
+ # ecx mov: times
141
+ # repeat = self label
142
+ # ecx push
143
+ # aBlock value
144
+ # ecx pop
145
+ # repeat loop
146
+
147
+ # arc4_encrypt: pArray len: len s: pS i: pI j: pJ
148
+ # <asm: void ARC4Encrypt( unsigned char* array, unsigned int len, unsigned char* s, unsigned int* i, unsigned int* j)>
149
+ # " edi = current character of @array that we're encrypting
150
+ # esi = address of @s keystream
151
+ # ecx = @len counting down
152
+ # eax = current math
153
+ # ebx = @i
154
+ # edx = @j
155
+ # current character to be encoded = [edi]
156
+ # current character at s[i] = [esi+ebx]
157
+ # current character at s[j] = [esi+edx]
158
+ # "
159
+ # ebx get: pI
160
+ # edx get: pJ
161
+ # esi mov: pS
162
+ # edi mov: pArray
163
+ # self repeat: len do: [
164
+ # bl inc. "i = (i + 1) mod: 255"
165
+ # al mov: [esi+ebx]. "si = s[i]"
166
+ # dl add: [esi+ebx]. "j = (j + s[i]) mod 256"
167
+ # cl mov: [esi+edx]. "sj = s[j]"
168
+ # "swap S[i] and S[j]"
169
+ # [esi+edx] mov: al. "s[j] = si"
170
+ # [esi+ebx] mov: cl. "s[i] = sj"
171
+ # al add: cl. "s[i] + s[j]"
172
+ # al mov: [esi+eax]. "s[s] mod 256"
173
+ # "array ^ s[s]"
174
+ # al xor: [edi]
175
+ # [edi] mov: al
176
+ # edi add: 1
177
+ # ]
178
+ # eax mov: pI
179
+ # [eax] mov: ebx
180
+ # eax mov: pJ
181
+ # [eax] mov: edx
182
+
183
+ # ARC4 initialize-release
184
+
185
+ # s: anS i: aI j: aJ
186
+ # s = anS gcCopyToHeap
187
+ # i = aI gcCopyToHeap
188
+ # j = aJ gcCopyToHeap
189
+ end
190
+
191
+ class TestARC4 < Test::Unit::TestCase
192
+ # ARC4Test testing
193
+
194
+ def testAttackAtDawn
195
+ # | encrypted |
196
+ # encrypted = ARC4 new setKey: 'Secret'; encrypt: 'Attack at dawn'
197
+ # self assert: (self decrypt: encrypted key: 'Secret') = 'Attack at dawn'
198
+
199
+ # decrypt: array key: key
200
+ # | arc4 |
201
+ # (arc4 = Security.ARC4 new) setKey: key asByteArray
202
+ # ^(array collect: [:e | arc4 decryptByte: e]) asString
203
+ end
204
+
205
+ def testPlaintext
206
+ # | encrypted |
207
+ # encrypted = ARC4 new setKey: 'Key'; encrypt: 'Plaintext'
208
+ # self assert: (self decrypt: encrypted key: 'Key') = 'Plaintext'
209
+ end
210
+
211
+ def testWikipedia
212
+ # | encrypted |
213
+ # encrypted = ARC4 new setKey: 'Wiki'; encrypt: 'pedia'
214
+ # self assert: (self decrypt: encrypted key: 'Wiki') = 'pedia'
215
+ end
216
+ end
@@ -29,17 +29,18 @@ class Integer
29
29
  end
30
30
  end
31
31
 
32
- class Module
33
- @@asm = []
32
+ ASM = []
34
33
 
34
+ class Module
35
35
  def defasm name, *args, &block
36
36
  asm = Wilson::MachineCodeX86.new
37
37
 
38
38
  asm.ebp.push
39
- # asm.esi.push # TODO?
40
- # asm.edi.push
41
39
  asm.ebp.mov asm.esp
42
40
 
41
+ asm.esi.push
42
+ asm.edi.push
43
+
43
44
  size = asm.stream.size
44
45
 
45
46
  asm.instance_eval(&block)
@@ -49,17 +50,30 @@ class Module
49
50
  asm.eax.mov 4
50
51
  end
51
52
 
52
- # asm.edi.pop
53
- # asm.esi.pop
54
- # asm.ebp.pop
53
+ asm.edi.pop
54
+ asm.esi.pop
55
55
 
56
56
  asm.leave
57
57
  asm.ret
58
58
 
59
59
  code = asm.stream.pack("C*")
60
- @@asm << code
61
60
 
62
- Ruby.rb_define_method self, name.to_s, code, 0
61
+ if $DEBUG then
62
+ path = "#{name}.obj"
63
+ File.open path, "wb" do |f|
64
+ f.write code
65
+ end
66
+
67
+ p name
68
+ puts code.unpack("C*").map { |n| "%02X" % n }.join(' ')
69
+ system "ndisasm -u #{path}"
70
+
71
+ File.unlink path
72
+ end
73
+
74
+ ptr = code.to_ptr
75
+ ASM << ptr
76
+ Ruby.rb_define_method self, name.to_s, ptr, 0
63
77
  end
64
78
  end
65
79
 
@@ -109,7 +123,7 @@ class Array
109
123
  end
110
124
 
111
125
  module Wilson
112
- VERSION = '1.0.0'
126
+ VERSION = '1.0.1'
113
127
 
114
128
  ##
115
129
  # Assembler parses the NASM documentation and creates Command
@@ -581,7 +595,7 @@ module Wilson
581
595
  ##
582
596
  # MachineCode is an abstract machine that has subclasses for each
583
597
  # concrete machine type that you can write assembly language for.
584
- # Right now this library only supports X86, so loko at
598
+ # Right now this library only supports X86, so look at
585
599
  # MachineCodeX86 for more details on how to use it.
586
600
 
587
601
  class MachineCode
@@ -848,6 +862,11 @@ module Wilson
848
862
  self.esi = Register.on_id_bits self, 6, 32
849
863
  self.edi = Register.on_id_bits self, 7, 32
850
864
  end
865
+
866
+ def to_ruby reg
867
+ reg.add reg
868
+ reg.inc
869
+ end
851
870
  end
852
871
 
853
872
  ##
metadata CHANGED
@@ -1,15 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wilson
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Davis
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain: []
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDPjCCAiagAwIBAgIBADANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu
14
+ ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
15
+ GRYDY29tMB4XDTA5MDMwNjE4NTMxNVoXDTEwMDMwNjE4NTMxNVowRTETMBEGA1UE
16
+ AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
17
+ JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
18
+ b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
19
+ taCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT
20
+ oOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh
21
+ GiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt
22
+ qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
23
+ gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
24
+ HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBBQUAA4IB
25
+ AQAY59gYvDxqSqgC92nAP9P8dnGgfZgLxP237xS6XxFGJSghdz/nI6pusfCWKM8m
26
+ vzjjH2wUMSSf3tNudQ3rCGLf2epkcU13/rguI88wO6MrE0wi4ZqLQX+eZQFskJb/
27
+ w6x9W1ur8eR01s397LSMexySDBrJOh34cm2AlfKr/jokKCTwcM0OvVZnAutaovC0
28
+ l1SVZ0ecg88bsWHA0Yhh7NFxK1utWoIhtB6AFC/+trM0FQEB/jZkIS8SaNzn96Rl
29
+ n0sZEf77FLf5peR8TP/PtmIg7Cyqz23sLM4mCOoTGIy5OcZ8TdyiyINUHtb5ej/T
30
+ FBHgymkyj/AOSqKRIpXPhjC6
31
+ -----END CERTIFICATE-----
11
32
 
12
- date: 2009-01-20 00:00:00 -08:00
33
+ date: 2009-04-22 00:00:00 -07:00
13
34
  default_executable:
14
35
  dependencies:
15
36
  - !ruby/object:Gem::Dependency
@@ -20,9 +41,15 @@ dependencies:
20
41
  requirements:
21
42
  - - ">="
22
43
  - !ruby/object:Gem::Version
23
- version: 1.8.3
44
+ version: 1.12.2
24
45
  version:
25
- description: Wilson is a pure ruby x86 assembler. No, really. Worst Idea Evar. Why "wilson"? I wanted to name it "metal", but there is an existing project with that name... So I'm naming it after Wilson Bilkovich, who is about as metal as you can get (and it is easier to spell than "bilkovich", even tho that sounds more metal).
46
+ description: |-
47
+ Wilson is a pure ruby x86 assembler. No, really. Worst Idea Evar.
48
+
49
+ Why "wilson"? I wanted to name it "metal", but there is an existing
50
+ project with that name... So I'm naming it after Wilson Bilkovich, who
51
+ is about as metal as you can get (and it is easier to spell than
52
+ "bilkovich", even tho that sounds more metal).
26
53
  email:
27
54
  - ryand-ruby@zenspider.com
28
55
  executables: []
@@ -38,10 +65,14 @@ files:
38
65
  - Manifest.txt
39
66
  - README.txt
40
67
  - Rakefile
68
+ - bench.rb
69
+ - example.rb
41
70
  - lib/wilson.rb
42
71
  - test/test_wilson.rb
43
72
  has_rdoc: true
44
73
  homepage: http://rubyforge.org/projects/seattlerb
74
+ licenses: []
75
+
45
76
  post_install_message:
46
77
  rdoc_options:
47
78
  - --main
@@ -63,9 +94,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
94
  requirements: []
64
95
 
65
96
  rubyforge_project: seattlerb
66
- rubygems_version: 1.3.1
97
+ rubygems_version: 1.3.2
67
98
  signing_key:
68
- specification_version: 2
99
+ specification_version: 3
69
100
  summary: Wilson is a pure ruby x86 assembler
70
101
  test_files:
71
102
  - test/test_wilson.rb
@@ -0,0 +1 @@
1
+ �����GXo�����������Ut������{t=�b��_C>H>�Q�ݘ�w�� ;�5+��°Ut^�{��"}��<���k���h0���$ j�G4g��&��͒u�[�j�$] r@׵8 g�#)V�!� �ԧ�D��Bf}c�Fv-�5���?(;p�9s�g����^��f~r�~�<����'_$�*�E�՞��h�Y�3����T43�8o g� ���CNh7R��t柨�Iy�d*c�*O��9�