evoasm 0.0.2.pre7
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 +7 -0
- data/.gemrelease +2 -0
- data/.gitignore +16 -0
- data/Gemfile +4 -0
- data/Gemfile.rake +8 -0
- data/Gemfile.rake.lock +51 -0
- data/LICENSE.txt +373 -0
- data/Makefile +6 -0
- data/README.md +43 -0
- data/Rakefile +128 -0
- data/bin/gdb +2 -0
- data/data/tables/README.md +19 -0
- data/data/tables/x64.csv +1684 -0
- data/data/templates/evoasm-x64.c.erb +319 -0
- data/data/templates/evoasm-x64.h.erb +126 -0
- data/evoasm.gemspec +30 -0
- data/examples/abs.yml +20 -0
- data/examples/popcnt.yml +17 -0
- data/examples/sym_reg.yml +26 -0
- data/exe/evoasm-search +13 -0
- data/ext/evoasm_ext/evoasm-alloc.c +145 -0
- data/ext/evoasm_ext/evoasm-alloc.h +59 -0
- data/ext/evoasm_ext/evoasm-arch.c +44 -0
- data/ext/evoasm_ext/evoasm-arch.h +161 -0
- data/ext/evoasm_ext/evoasm-bitmap.h +114 -0
- data/ext/evoasm_ext/evoasm-buf.c +130 -0
- data/ext/evoasm_ext/evoasm-buf.h +47 -0
- data/ext/evoasm_ext/evoasm-error.c +31 -0
- data/ext/evoasm_ext/evoasm-error.h +75 -0
- data/ext/evoasm_ext/evoasm-free-list.c.tmpl +121 -0
- data/ext/evoasm_ext/evoasm-free-list.h.tmpl +86 -0
- data/ext/evoasm_ext/evoasm-log.c +108 -0
- data/ext/evoasm_ext/evoasm-log.h +69 -0
- data/ext/evoasm_ext/evoasm-misc.c +23 -0
- data/ext/evoasm_ext/evoasm-misc.h +282 -0
- data/ext/evoasm_ext/evoasm-param.h +37 -0
- data/ext/evoasm_ext/evoasm-search.c +2145 -0
- data/ext/evoasm_ext/evoasm-search.h +214 -0
- data/ext/evoasm_ext/evoasm-util.h +40 -0
- data/ext/evoasm_ext/evoasm-x64.c +275624 -0
- data/ext/evoasm_ext/evoasm-x64.h +5436 -0
- data/ext/evoasm_ext/evoasm.c +7 -0
- data/ext/evoasm_ext/evoasm.h +23 -0
- data/ext/evoasm_ext/evoasm_ext.c +1757 -0
- data/ext/evoasm_ext/extconf.rb +31 -0
- data/lib/evoasm/cli/search.rb +127 -0
- data/lib/evoasm/cli.rb +6 -0
- data/lib/evoasm/core_ext/array.rb +9 -0
- data/lib/evoasm/core_ext/integer.rb +10 -0
- data/lib/evoasm/core_ext/kwstruct.rb +13 -0
- data/lib/evoasm/core_ext/range.rb +5 -0
- data/lib/evoasm/core_ext.rb +1 -0
- data/lib/evoasm/error.rb +20 -0
- data/lib/evoasm/examples.rb +27 -0
- data/lib/evoasm/gen/enum.rb +169 -0
- data/lib/evoasm/gen/name_util.rb +80 -0
- data/lib/evoasm/gen/state.rb +176 -0
- data/lib/evoasm/gen/state_dsl.rb +152 -0
- data/lib/evoasm/gen/strio.rb +27 -0
- data/lib/evoasm/gen/translator.rb +1102 -0
- data/lib/evoasm/gen/version.rb +5 -0
- data/lib/evoasm/gen/x64/funcs.rb +495 -0
- data/lib/evoasm/gen/x64/inst.rb +781 -0
- data/lib/evoasm/gen/x64.rb +237 -0
- data/lib/evoasm/gen.rb +8 -0
- data/lib/evoasm/program.rb +23 -0
- data/lib/evoasm/search.rb +40 -0
- data/lib/evoasm/tasks/gen_task.rb +86 -0
- data/lib/evoasm/tasks/template_task.rb +52 -0
- data/lib/evoasm/version.rb +3 -0
- data/lib/evoasm.rb +22 -0
- data/test/test_helper.rb +1 -0
- data/test/x64/test_helper.rb +19 -0
- data/test/x64/x64_test.rb +87 -0
- metadata +221 -0
@@ -0,0 +1,237 @@
|
|
1
|
+
module Evoasm::Gen
|
2
|
+
module X64
|
3
|
+
MNEM_BLACKLIST = %w()
|
4
|
+
|
5
|
+
# RFLAGS either not used at all
|
6
|
+
# or not read by any non-system instruction
|
7
|
+
IGNORED_RFLAGS = %i(RF VIF AC VM NT TF DF IF AF)
|
8
|
+
|
9
|
+
# Exception flag/mask bits. Mostly meant to be checked
|
10
|
+
# by the user, which we are not doing at the moment
|
11
|
+
IGNORED_MXCSR = %i(PE UE OE ME ZE DE IE PM UM OM ZM DM IM MM)
|
12
|
+
REGISTERS = {
|
13
|
+
ip: %i(IP),
|
14
|
+
rflags: %i(OF SF ZF PF CF),
|
15
|
+
mxcsr: %i(FZ RC DAZ),
|
16
|
+
gp: %i(A C D B SP BP SI DI 8 9 10 11 12 13 14 15),
|
17
|
+
mm: %i(MM0 MM1 MM2 MM3 MM4 MM5 MM6 MM7),
|
18
|
+
xmm: %i(XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 XMM8 XMM9 XMM10 XMM11 XMM12 XMM13 XMM14 XMM15),
|
19
|
+
zmm: %i(ZMM16 ZMM17 ZMM18 ZMM19 ZMM20 ZMM21 ZMM22 ZMM23 ZMM24 ZMM25 ZMM26 ZMM27 ZMM28 ZMM29 ZMM30 ZMM31)
|
20
|
+
}
|
21
|
+
|
22
|
+
REGISTER_NAMES = REGISTERS.values.flatten
|
23
|
+
|
24
|
+
CPUID = {
|
25
|
+
[0x1, nil] => {
|
26
|
+
d: %i(
|
27
|
+
fpu
|
28
|
+
vme
|
29
|
+
de
|
30
|
+
pse
|
31
|
+
tsc
|
32
|
+
msr
|
33
|
+
pae
|
34
|
+
mce
|
35
|
+
cx8
|
36
|
+
apic
|
37
|
+
reserved
|
38
|
+
sep
|
39
|
+
mtrr
|
40
|
+
pge
|
41
|
+
mca
|
42
|
+
cmov
|
43
|
+
pat
|
44
|
+
pse36
|
45
|
+
psn
|
46
|
+
clfsh
|
47
|
+
reserved
|
48
|
+
ds
|
49
|
+
acpi
|
50
|
+
mmx
|
51
|
+
fxsr
|
52
|
+
sse
|
53
|
+
sse2
|
54
|
+
ss
|
55
|
+
htt
|
56
|
+
tm
|
57
|
+
ia64
|
58
|
+
pbe),
|
59
|
+
c: %i(
|
60
|
+
sse3
|
61
|
+
pclmulqdq
|
62
|
+
dtes64
|
63
|
+
monitor
|
64
|
+
ds_cpl
|
65
|
+
vmx
|
66
|
+
smx
|
67
|
+
est
|
68
|
+
tm2
|
69
|
+
ssse3
|
70
|
+
cnxt_id
|
71
|
+
sdbg
|
72
|
+
fma
|
73
|
+
cx16
|
74
|
+
xtpr
|
75
|
+
pdcm
|
76
|
+
reserved
|
77
|
+
pcid
|
78
|
+
dca
|
79
|
+
sse4_1
|
80
|
+
sse4_2
|
81
|
+
x2apic
|
82
|
+
movbe
|
83
|
+
popcnt
|
84
|
+
tsc_deadline
|
85
|
+
aes
|
86
|
+
xsave
|
87
|
+
osxsave
|
88
|
+
avx
|
89
|
+
f16c
|
90
|
+
rdrnd
|
91
|
+
hypervisor
|
92
|
+
)
|
93
|
+
},
|
94
|
+
[0x7, 0x0] => {
|
95
|
+
b: %i(
|
96
|
+
fsgsbase
|
97
|
+
IA32_TSC_ADJUST
|
98
|
+
sgx
|
99
|
+
bmi1
|
100
|
+
hle
|
101
|
+
avx2
|
102
|
+
reserved
|
103
|
+
smep
|
104
|
+
bmi2
|
105
|
+
erms
|
106
|
+
invpcid
|
107
|
+
rtm
|
108
|
+
pqm
|
109
|
+
FPU_CS_DS_DEPRECATED
|
110
|
+
mpx
|
111
|
+
pqe
|
112
|
+
avx512f
|
113
|
+
avx512dq
|
114
|
+
rdseed
|
115
|
+
adx
|
116
|
+
smap
|
117
|
+
avx512ifma
|
118
|
+
pcommit
|
119
|
+
clflushopt
|
120
|
+
clwb
|
121
|
+
avx512pf
|
122
|
+
avx512er
|
123
|
+
avx512cd
|
124
|
+
sha
|
125
|
+
avx512bw
|
126
|
+
avx512vl
|
127
|
+
),
|
128
|
+
|
129
|
+
c: %i(
|
130
|
+
prefetchwt1
|
131
|
+
avx512vbmi
|
132
|
+
reserved
|
133
|
+
reserved
|
134
|
+
reserved
|
135
|
+
reserved
|
136
|
+
reserved
|
137
|
+
reserved
|
138
|
+
reserved
|
139
|
+
reserved
|
140
|
+
reserved
|
141
|
+
reserved
|
142
|
+
reserved
|
143
|
+
reserved
|
144
|
+
reserved
|
145
|
+
reserved
|
146
|
+
reserved
|
147
|
+
reserved
|
148
|
+
reserved
|
149
|
+
reserved
|
150
|
+
reserved
|
151
|
+
reserved
|
152
|
+
reserved
|
153
|
+
reserved
|
154
|
+
reserved
|
155
|
+
reserved
|
156
|
+
reserved
|
157
|
+
reserved
|
158
|
+
reserved
|
159
|
+
reserved
|
160
|
+
reserved
|
161
|
+
reserved
|
162
|
+
)
|
163
|
+
},
|
164
|
+
|
165
|
+
[0x80000001, nil] => {
|
166
|
+
d: %i(
|
167
|
+
fpu
|
168
|
+
vme
|
169
|
+
de
|
170
|
+
pse
|
171
|
+
tsc
|
172
|
+
msr
|
173
|
+
pae
|
174
|
+
mce
|
175
|
+
cx8
|
176
|
+
apic
|
177
|
+
reserved
|
178
|
+
syscall
|
179
|
+
mtrr
|
180
|
+
pge
|
181
|
+
mca
|
182
|
+
cmov
|
183
|
+
pat
|
184
|
+
pse36
|
185
|
+
reserved
|
186
|
+
mp
|
187
|
+
nx
|
188
|
+
reserved
|
189
|
+
mmxext
|
190
|
+
mmx
|
191
|
+
fxsr
|
192
|
+
fxsr_opt
|
193
|
+
pdpe1gb
|
194
|
+
rdtscp
|
195
|
+
reserved
|
196
|
+
lm
|
197
|
+
3dnowext
|
198
|
+
3dnow
|
199
|
+
),
|
200
|
+
|
201
|
+
c: %i(
|
202
|
+
lahf_lm
|
203
|
+
cmp_legacy
|
204
|
+
svm
|
205
|
+
extapic
|
206
|
+
cr8_legacy
|
207
|
+
abm
|
208
|
+
sse4a
|
209
|
+
misalignsse
|
210
|
+
3dnowprefetch
|
211
|
+
osvw
|
212
|
+
ibs
|
213
|
+
xop
|
214
|
+
skinit
|
215
|
+
wdt
|
216
|
+
reserved
|
217
|
+
lwp
|
218
|
+
fma4
|
219
|
+
tce
|
220
|
+
nodeid_msr
|
221
|
+
reserved
|
222
|
+
tbm
|
223
|
+
topoext
|
224
|
+
perfctr_core
|
225
|
+
perfctr_nb
|
226
|
+
reserved
|
227
|
+
dbx
|
228
|
+
perftsc
|
229
|
+
pcx_l2i
|
230
|
+
reserved
|
231
|
+
reserved
|
232
|
+
reserved
|
233
|
+
)
|
234
|
+
}
|
235
|
+
}
|
236
|
+
end
|
237
|
+
end
|
data/lib/evoasm/gen.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'evoasm/search'
|
2
|
+
|
3
|
+
module Evoasm
|
4
|
+
class Program
|
5
|
+
include Search::Util
|
6
|
+
|
7
|
+
def run(*input_example)
|
8
|
+
run_all(input_example).first
|
9
|
+
end
|
10
|
+
|
11
|
+
def run_all(*input_examples)
|
12
|
+
input_examples, input_arity = flatten_examples input_examples
|
13
|
+
p input_examples, input_arity
|
14
|
+
a = __run__ input_examples, input_arity
|
15
|
+
p a
|
16
|
+
a
|
17
|
+
end
|
18
|
+
|
19
|
+
def disassemble(*args)
|
20
|
+
buffer.disassemble(*args)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Evoasm
|
2
|
+
class Search
|
3
|
+
module Util
|
4
|
+
def flatten_examples(examples)
|
5
|
+
arity = check_arity examples
|
6
|
+
|
7
|
+
[examples.flatten, arity]
|
8
|
+
end
|
9
|
+
|
10
|
+
def check_arity(examples)
|
11
|
+
arity = Array(examples.first).size
|
12
|
+
examples.each do |example|
|
13
|
+
example_arity = Array(example).size
|
14
|
+
if arity && arity != example_arity
|
15
|
+
raise ArgumentError, "invalid arity for example '#{example}'"\
|
16
|
+
" (#{example_arity} for #{arity})"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
arity
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
DEFAULT_SEED = (1..64).to_a
|
24
|
+
def initialize(arch, examples:, instructions:, kernel_size:,
|
25
|
+
program_size:, population_size:, parameters:,
|
26
|
+
mutation_rate: 0.10, seed: DEFAULT_SEED, domains: {}, recur_limit: 0)
|
27
|
+
|
28
|
+
input_examples, output_examples = examples.keys, examples.values
|
29
|
+
input_examples, input_arity = flatten_examples input_examples
|
30
|
+
output_examples, output_arity = flatten_examples output_examples
|
31
|
+
|
32
|
+
__initialize__ input_examples, input_arity, output_examples, output_arity,
|
33
|
+
arch, population_size, kernel_size, program_size, instructions,
|
34
|
+
parameters, mutation_rate, seed, domains, recur_limit
|
35
|
+
end
|
36
|
+
|
37
|
+
include Util
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'evoasm'
|
2
|
+
require 'evoasm/gen/state'
|
3
|
+
require 'evoasm/gen/translator'
|
4
|
+
|
5
|
+
require 'rake'
|
6
|
+
|
7
|
+
module Evoasm
|
8
|
+
module Tasks
|
9
|
+
class GenTask < Rake::TaskLib
|
10
|
+
include Evoasm::Gen
|
11
|
+
|
12
|
+
HEADER_N_LINES = 15
|
13
|
+
CSV_SEPARATOR = ','
|
14
|
+
|
15
|
+
attr_accessor :ruby_bindings
|
16
|
+
attr_reader :name, :archs
|
17
|
+
|
18
|
+
ALL_ARCHS = %i(x64)
|
19
|
+
X64_TABLE_FILENAME = File.join(Evoasm.data, 'tables', 'x64.csv')
|
20
|
+
ARCH_TABLES = {
|
21
|
+
x64: X64_TABLE_FILENAME
|
22
|
+
}
|
23
|
+
|
24
|
+
def initialize(name = 'evoasm:gen', &block)
|
25
|
+
@ruby_bindings = true
|
26
|
+
@name = name
|
27
|
+
@archs = ALL_ARCHS
|
28
|
+
|
29
|
+
block[self] if block
|
30
|
+
|
31
|
+
define
|
32
|
+
end
|
33
|
+
|
34
|
+
def define
|
35
|
+
namespace 'evoasm:gen' do
|
36
|
+
archs.each do |arch|
|
37
|
+
prereqs = [ARCH_TABLES[arch]]
|
38
|
+
|
39
|
+
prereqs << Translator.template_path(arch)
|
40
|
+
target_path = gen_path(Translator.target_filename(arch))
|
41
|
+
|
42
|
+
file target_path => prereqs do
|
43
|
+
puts "Translating"
|
44
|
+
insts = load_insts arch
|
45
|
+
translator = Translator.new(arch, insts, ruby: ruby_bindings)
|
46
|
+
translator.translate! do |filename, content|
|
47
|
+
File.write gen_path(filename), content
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
task "translate:#{arch}" => target_path
|
52
|
+
end
|
53
|
+
|
54
|
+
task 'translate' => archs.map { |arch| "translate:#{arch}" }
|
55
|
+
end
|
56
|
+
|
57
|
+
task name => 'gen:translate'
|
58
|
+
end
|
59
|
+
|
60
|
+
def gen_path(filename)
|
61
|
+
File.join Evoasm.root, 'ext', 'evoasm_ext', filename
|
62
|
+
end
|
63
|
+
|
64
|
+
def load_insts(arch)
|
65
|
+
send :"load_#{arch}_insts"
|
66
|
+
end
|
67
|
+
|
68
|
+
def load_x64_insts
|
69
|
+
require 'evoasm/gen/x64/inst'
|
70
|
+
|
71
|
+
rows = []
|
72
|
+
File.open X64_TABLE_FILENAME do |file|
|
73
|
+
file.each_line.with_index do |line, line_idx|
|
74
|
+
# header
|
75
|
+
next if line_idx == 0
|
76
|
+
|
77
|
+
row = line.split(CSV_SEPARATOR)
|
78
|
+
rows << row
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
Gen::X64::Inst.load(rows)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Evoasm
|
5
|
+
module Tasks
|
6
|
+
class TemplateTask < Rake::TaskLib
|
7
|
+
attr_accessor :source
|
8
|
+
attr_accessor :target
|
9
|
+
attr_accessor :subs
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_reader :all
|
13
|
+
end
|
14
|
+
@all = []
|
15
|
+
|
16
|
+
def initialize(&block)
|
17
|
+
block[self] if block
|
18
|
+
define
|
19
|
+
end
|
20
|
+
|
21
|
+
def define
|
22
|
+
srcs = Array(source).map { |f| ext_path f }
|
23
|
+
dsts = Array(target).map { |f| gen_path f }
|
24
|
+
srcs.zip(dsts).each do |src, dst|
|
25
|
+
file dst => src do
|
26
|
+
data = File.read src
|
27
|
+
subs.sort_by{|k, _| k.length }.reverse.each do |name, value|
|
28
|
+
data.gsub! "$#{name}", value.to_s
|
29
|
+
data.gsub! "$#{name.upcase}", value.to_s.upcase
|
30
|
+
p "$-#{name}"
|
31
|
+
data.gsub! "$-#{name}", value.to_s.gsub('_', '-')
|
32
|
+
end
|
33
|
+
File.write dst, data
|
34
|
+
end
|
35
|
+
self.class.all << dst
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def ext_dir
|
40
|
+
File.join Evoasm.root, 'ext', 'evoasm_ext'
|
41
|
+
end
|
42
|
+
|
43
|
+
def ext_path(filename)
|
44
|
+
File.join ext_dir, filename
|
45
|
+
end
|
46
|
+
|
47
|
+
def gen_path(filename)
|
48
|
+
File.join ext_dir, 'gen', filename
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/evoasm.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'evoasm/version'
|
2
|
+
require 'evoasm/core_ext'
|
3
|
+
|
4
|
+
module Evoasm
|
5
|
+
def self.root
|
6
|
+
File.expand_path File.join(__dir__, '..')
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.data
|
10
|
+
File.join root, 'data'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
require 'evoasm_ext'
|
16
|
+
rescue LoadError => e
|
17
|
+
p e
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'evoasm/search'
|
21
|
+
require 'evoasm/program'
|
22
|
+
require 'evoasm/error'
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'minitest/autorun'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
require 'evoasm'
|
4
|
+
|
5
|
+
module MiniTest::Assertions
|
6
|
+
include Evoasm
|
7
|
+
|
8
|
+
def assert_disassembles_to(disasm, inst_name, **params)
|
9
|
+
assert_equal disasm,
|
10
|
+
Evoasm::X64.disassemble(@x64.encode(inst_name, params)).first
|
11
|
+
end
|
12
|
+
|
13
|
+
def assert_assembles_to(asm, inst_name, **params)
|
14
|
+
assert_equal asm, @x64.encode(inst_name, params)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Array.infect_an_assertion :assert_disassembles_to, :must_disassemble_to
|
19
|
+
Array.infect_an_assertion :assert_assembles_to, :must_assemble_to
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class X64Test < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@x64 = Evoasm::X64.new
|
6
|
+
@x64.encode :add_r32_rm32, reg0: :A, reg1: :B
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_rm_reg_reg
|
10
|
+
assert_disassembles_to 'add rax, rbx', :add_r64_rm64,
|
11
|
+
reg0: :A, reg1: :B
|
12
|
+
assert_disassembles_to 'add r11, r12', :add_r64_rm64,
|
13
|
+
reg0: :R11, reg1: :R12
|
14
|
+
assert_disassembles_to 'add eax, ebx', :add_r32_rm32,
|
15
|
+
reg0: :A, reg1: :B
|
16
|
+
assert_disassembles_to 'add ax, bx', :add_r16_rm16,
|
17
|
+
reg0: :A, reg1: :B
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_rm_reg_base
|
21
|
+
assert_disassembles_to 'add rax, qword ptr [rbx]', :add_r64_rm64,
|
22
|
+
reg0: :A, reg_base: :B
|
23
|
+
assert_disassembles_to 'add r11, qword ptr [r12]', :add_r64_rm64,
|
24
|
+
reg0: :R11, reg_base: :R12
|
25
|
+
assert_disassembles_to 'add eax, dword ptr [rbx]', :add_r32_rm32,
|
26
|
+
reg0: :A, reg_base: :B
|
27
|
+
assert_disassembles_to 'add ax, word ptr [rbx]', :add_r16_rm16,
|
28
|
+
reg0: :A, reg_base: :B
|
29
|
+
|
30
|
+
# reg1 should be ignored
|
31
|
+
assert_disassembles_to 'add eax, dword ptr [rbx]', :add_r32_rm32,
|
32
|
+
reg0: :A, reg1: :C, reg_base: :B
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_rm_reg_base32
|
36
|
+
assert_disassembles_to 'add rax, dword ptr [ebx]', :add_r64_rm64,
|
37
|
+
reg0: :A, reg_base: :B, address_size: 32
|
38
|
+
|
39
|
+
assert_disassembles_to 'add eax, dword ptr [ebx]', :add_r32_rm32,
|
40
|
+
reg0: :A, reg_base: :B, address_size: 32
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_rm_reg_sib
|
44
|
+
assert_disassembles_to 'add rax, qword ptr [rbx + rcx*4]', :add_r64_rm64,
|
45
|
+
reg0: :A, reg_base: :B, reg_index: :C, scale: 4
|
46
|
+
assert_disassembles_to 'add rax, qword ptr [rbx + rcx]', :add_r64_rm64,
|
47
|
+
reg0: :A, reg_base: :B, reg_index: :C, scale: 1
|
48
|
+
assert_disassembles_to 'add rax, qword ptr [rbx + rcx*8]', :add_r64_rm64,
|
49
|
+
reg0: :A, reg_base: :B, reg_index: :C, scale: 8
|
50
|
+
|
51
|
+
assert_disassembles_to 'add r10, qword ptr [r11 + r12*4]', :add_r64_rm64,
|
52
|
+
reg0: :R10, reg_base: :R11, reg_index: :R12, scale: 4
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_mi
|
57
|
+
assert_disassembles_to 'add rax, 0xa', :add_rm64_imm8,
|
58
|
+
reg0: :A, imm0: 0xa
|
59
|
+
|
60
|
+
assert_disassembles_to 'add qword ptr [rax], 0xa', :add_rm64_imm8,
|
61
|
+
reg_base: :A, imm0: 0xa
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_vex
|
65
|
+
assert_assembles_to "\xC5\xF5\xEC\xC2", :vpaddsb_ymm_ymm_ymmm256,
|
66
|
+
reg0: :XMM0, reg1: :XMM1, reg2: :XMM2, force_long_vex?: false
|
67
|
+
assert_assembles_to "\xC4\xE1u\xEC\xC2", :vpaddsb_ymm_ymm_ymmm256,
|
68
|
+
reg0: :XMM0, reg1: :XMM1, reg2: :XMM2, force_long_vex?: true
|
69
|
+
assert_disassembles_to 'vpaddsb ymm0, ymm1, ymm2', :vpaddsb_ymm_ymm_ymmm256,
|
70
|
+
reg0: :XMM0, reg1: :XMM1, reg2: :XMM2
|
71
|
+
assert_disassembles_to 'vpaddsb ymm0, ymm1, ymm2', :vpaddsb_ymm_ymm_ymmm256,
|
72
|
+
reg0: :XMM0, reg1: :XMM1, reg2: :XMM2, force_long_vex?: true
|
73
|
+
|
74
|
+
assert_assembles_to "\xC5\xF5\xEC\xC2", :vpaddsb_ymm_ymm_ymmm256,
|
75
|
+
reg0: :XMM0, reg1: :XMM1, reg2: :XMM2
|
76
|
+
assert_disassembles_to 'vpaddusb xmm0, xmm1, xmm2', :vpaddusb_xmm_xmm_xmmm128,
|
77
|
+
reg0: :XMM0, reg1: :XMM1, reg2: :XMM2
|
78
|
+
assert_assembles_to "\xC5\xF8\x5A\xCA", :vcvtps2pd_xmm_xmmm64,
|
79
|
+
reg0: :XMM1, reg1: :XMM2
|
80
|
+
assert_assembles_to "\xC5\xEA\x5A\xCB", :vcvtss2sd_xmm_xmm_xmmm32,
|
81
|
+
reg0: :XMM1, reg1: :XMM2, reg2: :XMM3
|
82
|
+
|
83
|
+
assert_assembles_to "\xC4\xE3\x79\x1D\xD1\x00", :vcvtps2ph_xmmm64_xmm_imm8,
|
84
|
+
reg0: :XMM1, reg1: :XMM2, imm0: 0x0
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|