evoasm 0.0.2.pre7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|