orgasm 0.0.1a2 → 0.0.1a3
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.
- data/bin/{disorgasm → ejaculate} +0 -0
- data/bin/swallow +0 -0
- data/lib/orgasm.rb +8 -2
- data/lib/orgasm/arch/i386.rb +27 -0
- data/lib/orgasm/{style.rb → arch/i386/base.rb} +4 -0
- data/lib/orgasm/{common → arch/i386/base}/address.rb +12 -19
- data/lib/orgasm/{common/unknown.rb → arch/i386/base/immediate.rb} +6 -10
- data/lib/orgasm/arch/i386/base/instruction.rb +41 -0
- data/lib/orgasm/arch/i386/base/register.rb +40 -0
- data/lib/orgasm/arch/i386/disassembler.rb +26 -154
- data/lib/orgasm/arch/i386/generator.rb +44 -0
- data/lib/orgasm/arch/i386/instructions.rb +150 -0
- data/lib/orgasm/arch/i386/instructions/dsl.rb +159 -0
- data/lib/orgasm/arch/i386/instructions/dsl/special.rb +75 -0
- data/lib/orgasm/arch/i386/instructions/instructions.rb +50 -0
- data/lib/orgasm/arch/i386/styles.rb +70 -0
- data/lib/orgasm/architecture.rb +103 -0
- data/lib/orgasm/assembler.rb +5 -16
- data/lib/orgasm/base.rb +50 -0
- data/lib/orgasm/{common/constant.rb → base/address.rb} +7 -6
- data/lib/orgasm/{common/register.rb → base/constant.rb} +11 -8
- data/lib/orgasm/base/instruction.rb +41 -0
- data/lib/orgasm/{common/instruction.rb → base/register.rb} +8 -8
- data/lib/orgasm/base/unknown.rb +36 -0
- data/lib/orgasm/disassembler.rb +25 -22
- data/lib/orgasm/disassembler/decoder.rb +26 -20
- data/lib/orgasm/{common/extensions.rb → extensions.rb} +12 -0
- data/lib/orgasm/generator.rb +46 -0
- data/lib/orgasm/generator/dsl.rb +60 -0
- data/lib/orgasm/piece.rb +49 -0
- data/lib/orgasm/styles.rb +64 -0
- data/lib/orgasm/styles/style.rb +55 -0
- data/lib/orgasm/version.rb +1 -1
- metadata +54 -14
- data/lib/orgasm/common.rb +0 -36
data/bin/{disorgasm → ejaculate}
RENAMED
File without changes
|
data/bin/swallow
ADDED
File without changes
|
data/lib/orgasm.rb
CHANGED
@@ -17,6 +17,12 @@
|
|
17
17
|
# along with orgasm. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
19
|
|
20
|
-
|
20
|
+
require 'orgasm/base'
|
21
21
|
|
22
|
-
|
22
|
+
require 'orgasm/piece'
|
23
|
+
require 'orgasm/styles'
|
24
|
+
require 'orgasm/disassembler'
|
25
|
+
require 'orgasm/generator'
|
26
|
+
require 'orgasm/assembler'
|
27
|
+
|
28
|
+
require 'orgasm/architecture'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of orgasm.
|
5
|
+
#
|
6
|
+
# orgasm is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# orgasm is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with orgasm. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'orgasm/arch/i386/base'
|
21
|
+
|
22
|
+
Orgasm::Architecture.for 'i386' do
|
23
|
+
instructions 'orgasm/arch/i386/instructions'
|
24
|
+
disassembler 'orgasm/arch/i386/disassembler'
|
25
|
+
generator 'orgasm/arch/i386/generator'
|
26
|
+
styles 'orgasm/arch/i386/styles'
|
27
|
+
end
|
@@ -17,33 +17,26 @@
|
|
17
17
|
# along with orgasm. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
19
|
|
20
|
-
module Orgasm
|
20
|
+
module Orgasm; module I386
|
21
21
|
|
22
|
-
class Address
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
if offset
|
27
|
-
@start = value
|
28
|
-
@value = offset.to_i
|
22
|
+
class Address < Orgasm::Address
|
23
|
+
def initialize (value=nil, options={})
|
24
|
+
if value.respond_to? :to_i
|
25
|
+
super(value)
|
29
26
|
else
|
30
|
-
|
27
|
+
super()
|
31
28
|
end
|
32
29
|
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
def offset?
|
37
|
-
!!start
|
30
|
+
@options = options
|
38
31
|
end
|
39
32
|
|
40
|
-
def
|
41
|
-
|
33
|
+
def relative?
|
34
|
+
!!@options[:relative]
|
42
35
|
end
|
43
36
|
|
44
|
-
def
|
45
|
-
offset
|
37
|
+
def offset?
|
38
|
+
!!@options[:offset]
|
46
39
|
end
|
47
40
|
end
|
48
41
|
|
49
|
-
end
|
42
|
+
end; end
|
@@ -17,18 +17,14 @@
|
|
17
17
|
# along with orgasm. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
19
|
|
20
|
-
module Orgasm
|
20
|
+
module Orgasm; module I386
|
21
21
|
|
22
|
-
class
|
23
|
-
|
24
|
-
@size = size.to_i
|
22
|
+
class Immediate < Orgasm::Constant
|
23
|
+
attr_accessor :size
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
def to_i
|
30
|
-
@size
|
25
|
+
def initialize (value=nil, size=nil)
|
26
|
+
super(value)
|
31
27
|
end
|
32
28
|
end
|
33
29
|
|
34
|
-
end
|
30
|
+
end; end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of orgasm.
|
5
|
+
#
|
6
|
+
# orgasm is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# orgasm is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with orgasm. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
module Orgasm; module I386
|
21
|
+
|
22
|
+
class Instruction < Orgasm::Instruction
|
23
|
+
extend Forwardable
|
24
|
+
|
25
|
+
def_delegator :@parameters, :first, :destination
|
26
|
+
def_delegator :@parameters, :last, :source
|
27
|
+
|
28
|
+
def initialize (name=nil, destination=nil, source=nil)
|
29
|
+
super(name, destination, source)
|
30
|
+
end
|
31
|
+
|
32
|
+
def destination= (value)
|
33
|
+
parameters[0] = value
|
34
|
+
end
|
35
|
+
|
36
|
+
def source= (value)
|
37
|
+
parameters[1] = value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end; end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of orgasm.
|
5
|
+
#
|
6
|
+
# orgasm is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# orgasm is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with orgasm. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
module Orgasm; module I386
|
21
|
+
|
22
|
+
class Register < Orgasm::Register
|
23
|
+
attr_accessor :size
|
24
|
+
|
25
|
+
def initialize (name=nil)
|
26
|
+
super(name, Architecture.i386.instructions.register?(name))
|
27
|
+
end
|
28
|
+
|
29
|
+
def name= (value)
|
30
|
+
value = value.to_s.downcase.to_sym
|
31
|
+
|
32
|
+
unless Architecture.i386.instructions.register?(value)
|
33
|
+
raise ArgumentError, "#{value} isn't a valid i386 register"
|
34
|
+
end
|
35
|
+
|
36
|
+
@name = value
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end; end
|
@@ -17,162 +17,34 @@
|
|
17
17
|
# along with orgasm. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
DX: 0x2,
|
41
|
-
BX: 0x3,
|
42
|
-
SP: 0x4,
|
43
|
-
BP: 0x5,
|
44
|
-
SI: 0x6,
|
45
|
-
DI: 0x7
|
46
|
-
},
|
47
|
-
|
48
|
-
8 => {
|
49
|
-
AL: 0x0,
|
50
|
-
CL: 0x1,
|
51
|
-
DL: 0x2,
|
52
|
-
BL: 0x3,
|
53
|
-
AH: 0x4,
|
54
|
-
CH: 0x5,
|
55
|
-
DH: 0x6,
|
56
|
-
BH: 0x7
|
57
|
-
}
|
58
|
-
)
|
59
|
-
end
|
60
|
-
|
61
|
-
def source (byte, bits=32)
|
62
|
-
self[bits].key((byte & 0x38) >> 3)
|
63
|
-
end
|
64
|
-
|
65
|
-
def destination (byte, bits=32)
|
66
|
-
self[bits].key(byte & 0x07)
|
67
|
-
end; alias dest destination
|
68
|
-
}.new
|
69
|
-
|
70
|
-
on ?\x01, ?\x09, ?\x11, ?\x19, ?\x21, ?\x25, ?\x29, ?\x31, ?\x39, ?\x85, ?\x86, ?\x87, ?\x89, ?\xA1, ?\xA3 do
|
71
|
-
increment = 1
|
72
|
-
|
73
|
-
seek 1 do
|
74
|
-
read 1 do |data|
|
75
|
-
increment += 1 if data.to_byte & 0x07 == reg[32][:ESP]
|
76
|
-
increment += 1 if (data.to_byte & 0xC0) >> 6 == 0x01
|
77
|
-
|
78
|
-
if (data.to_byte & 0xC0) >> 6 == 0x10
|
79
|
-
Unknown.new(1)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
on ?\x01 do
|
85
|
-
Instruction.new(:add) {|i|
|
86
|
-
seek +1
|
87
|
-
|
88
|
-
read 1 do |data|
|
89
|
-
i.parameters << Register.new(reg.source(data.to_byte), 32)
|
90
|
-
i.parameters << Register.new(reg.destination(data.to_byte), 32)
|
91
|
-
end
|
92
|
-
|
93
|
-
seek increment
|
94
|
-
}
|
95
|
-
end
|
96
|
-
|
97
|
-
on ?\x09 do
|
98
|
-
Instruction.new(:or) {
|
99
|
-
seek +1
|
100
|
-
}
|
101
|
-
end
|
102
|
-
|
103
|
-
on ?\x11 do
|
104
|
-
Instruction.new(:adc) {
|
105
|
-
seek +1
|
106
|
-
}
|
107
|
-
end
|
108
|
-
|
109
|
-
on ?\x19 do
|
110
|
-
Instruction.new(:sbb) {
|
111
|
-
seek +1
|
112
|
-
}
|
113
|
-
end
|
114
|
-
|
115
|
-
on ?\x21, ?\x25 do
|
116
|
-
Instruction.new(:ad) {
|
117
|
-
seek +1
|
118
|
-
}
|
119
|
-
end
|
120
|
-
|
121
|
-
on ?\x29 do
|
122
|
-
Instruction.new(:sub) {
|
123
|
-
seek +1
|
124
|
-
}
|
125
|
-
end
|
126
|
-
|
127
|
-
on ?\x31 do
|
128
|
-
Instruction.new(:xor) {
|
129
|
-
seek +1
|
130
|
-
}
|
131
|
-
end
|
132
|
-
|
133
|
-
on ?\x19 do
|
134
|
-
Instruction.new(:cmp) {
|
135
|
-
seek +1
|
136
|
-
}
|
137
|
-
end
|
138
|
-
|
139
|
-
on ?\x85 do
|
140
|
-
Instruction.new(:test) {
|
141
|
-
seek +1
|
142
|
-
}
|
143
|
-
end
|
144
|
-
|
145
|
-
on ?\x86 do
|
146
|
-
Instruction.new(:xchg) {
|
147
|
-
seek +1
|
148
|
-
|
149
|
-
# 8bit
|
150
|
-
}
|
151
|
-
end
|
152
|
-
|
153
|
-
on ?\x87 do
|
154
|
-
Instruction.new(:xchg) {
|
155
|
-
seek +1
|
156
|
-
}
|
157
|
-
end
|
158
|
-
|
159
|
-
on ?\x89 do
|
160
|
-
Instruction.new(:mov) {
|
161
|
-
seek +1
|
162
|
-
|
163
|
-
read 1 do |data|
|
164
|
-
increment = 5 if data.to_byte & 0x07 == 0x05 && data.to_byte < 0x40
|
20
|
+
instructions.to_hash.each {|name, description|
|
21
|
+
description.each {|description|
|
22
|
+
if description.is_a?(Hash)
|
23
|
+
description.each {|params, opcodes|
|
24
|
+
opcodes = opcodes.clone
|
25
|
+
known = opcodes.reverse.drop_while {|x| !x.is_a?(Integer)}.reverse.map {|x| x.chr}.join
|
26
|
+
opcodes.slice! known.length
|
27
|
+
|
28
|
+
on known do |whole, which|
|
29
|
+
seek which.length do
|
30
|
+
if opcodes.first.is_a?(String)
|
31
|
+
check = opcodes.shift.to_i
|
32
|
+
|
33
|
+
read 1 do |data|
|
34
|
+
skip unless ((data.to_byte & '00111000'.to_i(2)) >> 3) == check
|
35
|
+
end
|
36
|
+
|
37
|
+
opcodes.shift
|
38
|
+
end
|
39
|
+
end
|
165
40
|
end
|
166
41
|
}
|
167
|
-
|
42
|
+
else
|
43
|
+
on description.map {|b| b.chr}.join do |whole, which|
|
44
|
+
seek which.length
|
168
45
|
|
169
|
-
|
170
|
-
|
171
|
-
Instruction.new(:mov) {
|
172
|
-
seek +1
|
173
|
-
}
|
46
|
+
I386::Instruction.new(name)
|
47
|
+
end
|
174
48
|
end
|
175
|
-
|
49
|
+
}
|
176
50
|
}
|
177
|
-
|
178
|
-
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of orgasm.
|
5
|
+
#
|
6
|
+
# orgasm is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# orgasm is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with orgasm. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
instructions.registers.each {|register|
|
21
|
+
define_singleton_method register do
|
22
|
+
register
|
23
|
+
end
|
24
|
+
}
|
25
|
+
|
26
|
+
generator.for I386::Instruction do |name, &block|
|
27
|
+
I386::Instruction.new(name, &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
generator.for I386::Register do |name|
|
31
|
+
I386::Register.new(name)
|
32
|
+
end
|
33
|
+
|
34
|
+
generator.for I386::Address do |data|
|
35
|
+
if data.is_a?(Array)
|
36
|
+
Address.new(data)
|
37
|
+
else
|
38
|
+
Address.new(data)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
generator.for I386::Immediate do |data|
|
43
|
+
I386::Immediate.new(data, 32)
|
44
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of orgasm.
|
5
|
+
#
|
6
|
+
# orgasm is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# orgasm is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with orgasm. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'orgasm/arch/i386/instructions/dsl'
|
21
|
+
require 'orgasm/arch/i386/instructions/instructions'
|
22
|
+
|
23
|
+
I386::Instructions[I386::DSL.new {
|
24
|
+
# ASCII Adjust After Addition
|
25
|
+
AAA [0x37]
|
26
|
+
|
27
|
+
# ASCII Adjust AX Before Division
|
28
|
+
AAD [0xD5, 0x0A],
|
29
|
+
[imm8] => [0xD5, ib]
|
30
|
+
|
31
|
+
# ASCII Adjust AX After Multiply
|
32
|
+
AAM [0xD4, 0x0A],
|
33
|
+
[imm8] => [0xD4, ib]
|
34
|
+
|
35
|
+
# ASCII Adjust AL After Substraction
|
36
|
+
AAS [0x3F]
|
37
|
+
|
38
|
+
# Add with Carry
|
39
|
+
ADC [al, imm8] => [0x14, ib],
|
40
|
+
[ax, imm16] => [0x15, iw],
|
41
|
+
[eax, imm32] => [0x15, id],
|
42
|
+
[r8|m8, imm8] => [0x80, ?2, ib],
|
43
|
+
[r16|m16, imm16] => [0x81, ?2, iw],
|
44
|
+
[r32|m32, imm32] => [0x81, ?2, id],
|
45
|
+
[r16|m16, imm8] => [0x83, ?2, ib],
|
46
|
+
[r32|m32, imm8] => [0x83, ?2, ib],
|
47
|
+
[r8|m8, r8] => [0x10, r],
|
48
|
+
[r16|m16, r16] => [0x11, r],
|
49
|
+
[r32|m32, r32] => [0x11, r],
|
50
|
+
[r8, r8|m8] => [0x12, r],
|
51
|
+
[r16, r16|m16] => [0x13, r],
|
52
|
+
[r32, r32|m32] => [0x13, r]
|
53
|
+
|
54
|
+
# Add
|
55
|
+
ADD [al, imm8] => [0x04, ib],
|
56
|
+
[ax, imm16] => [0x05, iw],
|
57
|
+
[eax, imm32] => [0x05, id],
|
58
|
+
[r8|m8, imm8] => [0x80, ?0, ib],
|
59
|
+
[r16|m16, imm16] => [0x81, ?0, iw],
|
60
|
+
[r32|m32, imm32] => [0x81, ?0, id],
|
61
|
+
[r16|m16, imm8] => [0x83, ?0, ib],
|
62
|
+
[r32|m32, imm8] => [0x83, ?0, ib],
|
63
|
+
[r8|m8, r8] => [0x00, r],
|
64
|
+
[r16|m16, r16] => [0x01, r],
|
65
|
+
[r32|m32, r32] => [0x01, r],
|
66
|
+
[r8, r8|m8] => [0x02, r],
|
67
|
+
[r16, r16|m16] => [0x03, r],
|
68
|
+
[r32, r32|m32] => [0x03, r]
|
69
|
+
|
70
|
+
# Logical AND
|
71
|
+
AND [al, imm8] => [0x24, ib],
|
72
|
+
[ax, imm16] => [0x25, iw],
|
73
|
+
[eax, imm32] => [0x25, id],
|
74
|
+
[r8|m8, imm8] => [0x80, ?4, ib],
|
75
|
+
[r16|m16, imm16] => [0x81, ?4, iw],
|
76
|
+
[r32|m32, imm32] => [0x81, ?4, id],
|
77
|
+
[r16|m16, imm8] => [0x83, ?4, ib],
|
78
|
+
[r32|m32, imm8] => [0x83, ?4, ib],
|
79
|
+
[r8|m8, r8] => [0x20, r],
|
80
|
+
[r16|m16, r16] => [0x21, r],
|
81
|
+
[r32|m32, r32] => [0x21, r],
|
82
|
+
[r8, r8|m8] => [0x22, r],
|
83
|
+
[r16, r16|m16] => [0x23, r],
|
84
|
+
[r32, r32|m32] => [0x23, r]
|
85
|
+
|
86
|
+
# Adjust RPL Field of Segment Selector
|
87
|
+
ARPL [r16|m16, r16] => [0x63, r]
|
88
|
+
|
89
|
+
# Check Array Index Against Bounds
|
90
|
+
BOUND [r16, m16&16] => [0x62, r],
|
91
|
+
[r32, m32&32] => [0x62, r]
|
92
|
+
|
93
|
+
# Bit Scan Forward
|
94
|
+
# BFS [r16, r16|m16] => [0x0F, 0xBC],
|
95
|
+
# [r32, r32|m32] => [0x0F, 0xBC]
|
96
|
+
# TODO: find out what the fuck is this
|
97
|
+
|
98
|
+
# Bit Scan Reverse
|
99
|
+
# BSR [r16, r16|m16] => [0x0F, 0xBD],
|
100
|
+
# [r32, r32|m32] => [0x0F, 0xBD]
|
101
|
+
# TODO: find out what the fuck is this
|
102
|
+
|
103
|
+
# Byte Swap
|
104
|
+
BSWAP [r32] => [0x0F, 0xC8, rd]
|
105
|
+
# FIXME: not available on i386, only i486+
|
106
|
+
|
107
|
+
# Bit Test
|
108
|
+
BT [r16|m16, r16] => [0x0F, 0xA3],
|
109
|
+
[r32|m32, r32] => [0x0F, 0xA3],
|
110
|
+
[r16|m16, imm8] => [0x0F, 0xBA, ?4, ib],
|
111
|
+
[r32|m32, imm8] => [0x0F, 0xBA, ?4, ib]
|
112
|
+
|
113
|
+
# Bit Test and Complement
|
114
|
+
BTC [r16|m16, r16] => [0x0F, 0xBB],
|
115
|
+
[r32|m32, r32] => [0x0F, 0xBB],
|
116
|
+
[r16|m16, imm8] => [0x0F, 0xBA, ?7, ib],
|
117
|
+
[r32|m32, imm8] => [0x0F, 0xBA, ?7, ib]
|
118
|
+
|
119
|
+
# Bit Test and Reset
|
120
|
+
BTR [r16|m16, r16] => [0x0F, 0xB3],
|
121
|
+
[r32|m32, r32] => [0x0F, 0xB3],
|
122
|
+
[r16|m16, imm8] => [0x0F, 0xBA, ?6, ib],
|
123
|
+
[r32|m32, imm8] => [0x0F, 0xBA, ?6, ib]
|
124
|
+
|
125
|
+
# Call Procedure
|
126
|
+
CALL [rel16] => [0xE8, cw],
|
127
|
+
[rel32] => [0xE8, cd],
|
128
|
+
[r16|m16] => [0xFF, ?2],
|
129
|
+
[r32|m32] => [0xFF, ?2],
|
130
|
+
[ptr16^16] => [0x9A, cd],
|
131
|
+
[ptr16^32] => [0x9A, cp],
|
132
|
+
[m16^16] => [0xFF, ?3],
|
133
|
+
[m16^32] => [0xFF, ?3]
|
134
|
+
|
135
|
+
|
136
|
+
# -- x87 FPU --
|
137
|
+
|
138
|
+
# Packed Single-FP Add
|
139
|
+
ADDPS [xmm1, xmm2|m128] => [0x0F, 0x58, r]
|
140
|
+
|
141
|
+
# Scalar Single-FP Add
|
142
|
+
ADDSS [xmm1, xmm2|m32] => [0xF3, 0x0F, 0x58, r]
|
143
|
+
|
144
|
+
# Bit-wise Logical And ot For Single-FP
|
145
|
+
ANDNPS [xmm1, xmm2|m128] => [0x0F, 0x55, r]
|
146
|
+
|
147
|
+
# Bit-wise Logical And For Single FP
|
148
|
+
ANDPS [xmm1, xmm2|m128] => [0x0F, 0x54, r]
|
149
|
+
|
150
|
+
}.to_hash]
|