-
Notifications
You must be signed in to change notification settings - Fork 0
/
tmp
233 lines (227 loc) · 19.4 KB
/
tmp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
container = []
container.append((0x00, 'nop','什么都不做'))
container.append((0x01, 'aconst_null','将 null 推送至栈顶'))
container.append((0x02, 'iconst_m1','将 int 型 -1 推送至栈顶'))
container.append((0x03, 'iconst_0','将 int 型 0 推送至栈顶'))
container.append((0x04, 'iconst_1','将 int 型 1 推送至栈顶'))
container.append((0x05, 'iconst_2','将 int 型 2 推送至栈顶'))
container.append((0x06, 'iconst_3','将 int 型 3 推送至栈顶'))
container.append((0x07, 'iconst_4','将 int 型 4 推送至栈顶'))
container.append((0x08, 'iconst_5','将 int 型 5 推送至栈顶'))
container.append((0x09, 'lconst_0','将 long 型 0 推送至栈顶'))
container.append((0x0a, 'lconst_1','将 long 型 1 推送至栈顶'))
container.append((0x0b, 'fconst_0','将 float 型 0 推送至栈顶'))
container.append((0x0c, 'fconst_1','将 float 型 1 推送至栈顶'))
container.append((0x0d, 'fconst_2','将 float 型 2 推送至栈顶'))
container.append((0x0e, 'dconst_0','将 double 型 0 推送至栈顶'))
container.append((0x0f, 'dconst_1','将 double 型 1 推送至栈顶'))
container.append((0x10, 'bipush','将单字节的常量值 (-128~127) 推送至栈顶'))
container.append((0x11, 'sipush','将一个短整型常量值 (-32768~32767) 推送至栈顶'))
container.append((0x12, 'ldc','将int,'))
container.append((0x13, 'ldc_w','将int,'))
container.append((0x14, 'ldc2_w','将 long 或 double 型常量值从常量池中推送至栈顶(宽索引)'))
container.append((0x15, 'iload','将指定的 int 型本地变量推送至栈顶'))
container.append((0x16, 'lload','将指定的 long 型本地变量推送至栈顶'))
container.append((0x17, 'fload','将指定的 float 型本地变量推送至栈顶'))
container.append((0x18, 'dload','将指定的 double 型本地变量推送至栈顶'))
container.append((0x19, 'aload','将指定的引用类型本地变量推送至栈顶'))
container.append((0x1a, 'iload_0','将第一个 int 型本地变量推送至栈顶'))
container.append((0x1b, 'iload_1','将第二个 int 型本地变量推送至栈顶'))
container.append((0x1c, 'iload_2','将第三个 int 型本地变量推送至栈顶'))
container.append((0x1d, 'iload_3','将第四个 int 型本地变量推送至栈顶'))
container.append((0x1e, 'lload_0','将第一个 long 型本地变量推送至栈顶'))
container.append((0x1f, 'lload_1','将第二个 long 型本地变量推送至栈顶'))
container.append((0x20, 'lload_2','将第三个 long 型本地变量推送至栈顶'))
container.append((0x21, 'lload_3','将第四个 long 型本地变量推送至栈顶'))
container.append((0x22, 'fload_0','将第一个 float 型本地变量推送至栈顶'))
container.append((0x23, 'fload_1','将第二个 float 型本地变量推送至栈顶'))
container.append((0x24, 'fload_2','将第三个 float 型本地变量推送至栈顶'))
container.append((0x25, 'fload_3','将第四个 float 型本地变量推送至栈顶'))
container.append((0x26, 'dload_0','将第一个 double 型本地变量推送至栈顶'))
container.append((0x27, 'dload_1','将第二个 double 型本地变量推送至栈顶'))
container.append((0x28, 'dload_2','将第三个 double 型本地变量推送至栈顶'))
container.append((0x29, 'dload_3','将第四个 double 型本地变量推送至栈顶'))
container.append((0x2a, 'aload_0','将第一个引用类型本地变量推送至栈顶'))
container.append((0x2b, 'aload_1','将第二个引用类型本地变量推送至栈顶'))
container.append((0x2c, 'aload_2','将第三个引用类型本地变量推送至栈顶'))
container.append((0x2d, 'aload_3','将第四个引用类型本地变量推送至栈顶'))
container.append((0x2e, 'iaload','将 int 型数组指定索引的值推送至栈顶'))
container.append((0x2f, 'laload','将 long 型数组指定索引的值推送至栈顶'))
container.append((0x30, 'faload','将 float 型数组指定索引的值推送至栈顶'))
container.append((0x31, 'daload','将 double 型数组指定索引的值推送至栈顶'))
container.append((0x32, 'aaload','将引用型数组指定索引的值推送至栈顶'))
container.append((0x33, 'baload','将 boolean 或 byte 型数组指定索引的值推送至栈顶'))
container.append((0x34, 'caload','将 char 型数组指定索引的值推送至栈顶'))
container.append((0x35, 'saload','将 short 型数组指定索引的值推送至栈顶'))
container.append((0x36, 'istore','将栈顶 int 型数值存入指定本地变量'))
container.append((0x37, 'lstore','将栈顶 long 型数值存入指定本地变量'))
container.append((0x38, 'fstore','将栈顶 float 型数值存入指定本地变量'))
container.append((0x39, 'dstore','将栈顶 double 型数值存入指定本地变量'))
container.append((0x3a, 'astore','将栈顶引用型数值存入指定本地变量'))
container.append((0x3b, 'istore_0','将栈顶 int 型数值存入第一个本地变量'))
container.append((0x3c, 'istore_1','将栈顶 int 型数值存入第二个本地变量'))
container.append((0x3d, 'istore_2','将栈顶 int 型数值存入第三个本地变量'))
container.append((0x3e, 'istore_3','将栈顶 int 型数值存入第四个本地变量'))
container.append((0x3f, 'lstore_0','将栈顶 long 型数值存入第一个本地变量'))
container.append((0x40, 'lstore_1','将栈顶 long 型数值存入第二个本地变量'))
container.append((0x41, 'lstore_2','将栈顶 long 型数值存入第三个本地变量'))
container.append((0x42, 'lstore_3','将栈顶 long 型数值存入第四个本地变量'))
container.append((0x43, 'fstore_0','将栈顶 float 型数值存入第一个本地变量'))
container.append((0x44, 'fstore_1','将栈顶 float 型数值存入第二个本地变量'))
container.append((0x45, 'fstore_2','将栈顶 float 型数值存入第三个本地变量'))
container.append((0x46, 'fstore_3','将栈顶 float 型数值存入第四个本地变量'))
container.append((0x47, 'dstore_0','将栈顶 double 型数值存入第一个本地变量'))
container.append((0x48, 'dstore_1','将栈顶 double 型数值存入第二个本地变量'))
container.append((0x49, 'dstore_2','将栈顶 double 型数值存入第三个本地变量'))
container.append((0x4a, 'dstore_3','将栈顶 double 型数值存入第四个本地变量'))
container.append((0x4b, 'astore_0','将栈顶引用型数值存入第一个本地变量'))
container.append((0x4c, 'astore_1','将栈顶引用型数值存入第二个本地变量'))
container.append((0x4d, 'astore_2','将栈顶引用型数值存入第三个本地变量'))
container.append((0x4e, 'astore_3','将栈顶引用型数值存入第四个本地变量'))
container.append((0x4f, 'iastore','将栈顶 int 型数值存入指定数组的指定索引位置'))
container.append((0x50, 'lastore','将栈顶 long 型数值存入指定数组的指定索引位置'))
container.append((0x51, 'fastore','将栈顶 float 型数值存入指定数组的指定索引位置'))
container.append((0x52, 'dastore','将栈顶 double 型数值存入指定数组的指定索引位置'))
container.append((0x53, 'aastore','将栈顶引用型数值存入指定数组的指定索引位置'))
container.append((0x54, 'bastore','将栈顶 boolean 或 byte 型数值存入指定数组的指定索引位置'))
container.append((0x55, 'castore','将栈顶 char 型数值存入指定数组的指定索引位置'))
container.append((0x56, 'sastore','将栈顶 short 型数值存入指定数组的指定索引位置'))
container.append((0x57, 'pop','将栈顶数值弹出'))
container.append((0x58, 'pop2','将栈顶的一个(long 或 double 类型的)或两个数值弹出(其它)'))
container.append((0x59, 'dup','复制栈顶数值并将复制值压入栈顶'))
container.append((0x5a, 'dup_x1','复制栈顶数值并将两个复制值压入栈顶'))
container.append((0x5b, 'dup_x2','复制栈顶数值并将三个(或两个)复制值压入栈顶'))
container.append((0x5c, 'dup2','复制栈顶一个(long 或 double 类型的)或两个(其它)数值并将复制值压入栈顶'))
container.append((0x5d, 'dup2_x1','<待补充>'))
container.append((0x5e, 'dup2_x2','<待补充>'))
container.append((0x5f, 'swap','将栈最顶端的两个数值互换(数值不能是 long 或 double 类型的)'))
container.append((0x60, 'iadd','将栈顶两 int 型数值相加并将结果压入栈顶'))
container.append((0x61, 'ladd','将栈顶两 long 型数值相加并将结果压入栈顶'))
container.append((0x62, 'fadd','将栈顶两 float 型数值相加并将结果压入栈顶'))
container.append((0x63, 'dadd','将栈顶两 double 型数值相加并将结果压入栈顶'))
container.append((0x64, 'isub','将栈顶两 int 型数值相减并将结果压入栈顶'))
container.append((0x65, 'lsub','将栈顶两 long 型数值相减并将结果压入栈顶'))
container.append((0x66, 'fsub','将栈顶两 float 型数值相减并将结果压入栈顶'))
container.append((0x67, 'dsub','将栈顶两 double 型数值相减并将结果压入栈顶'))
container.append((0x68, 'imul','将栈顶两 int 型数值相乘并将结果压入栈顶'))
container.append((0x69, 'lmul','将栈顶两 long 型数值相乘并将结果压入栈顶'))
container.append((0x6a, 'fmul','将栈顶两 float 型数值相乘并将结果压入栈顶'))
container.append((0x6b, 'dmul','将栈顶两 double 型数值相乘并将结果压入栈顶'))
container.append((0x6c, 'idiv','将栈顶两 int 型数值相除并将结果压入栈顶'))
container.append((0x6d, 'ldiv','将栈顶两 long 型数值相除并将结果压入栈顶'))
container.append((0x6e, 'fdiv','将栈顶两 float 型数值相除并将结果压入栈顶'))
container.append((0x6f, 'ddiv','将栈顶两 double 型数值相除并将结果压入栈顶'))
container.append((0x70, 'irem','将栈顶两 int 型数值作取模运算并将结果压入栈顶'))
container.append((0x71, 'lrem','将栈顶两 long 型数值作取模运算并将结果压入栈顶'))
container.append((0x72, 'frem','将栈顶两 float 型数值作取模运算并将结果压入栈顶'))
container.append((0x73, 'drem','将栈顶两 double 型数值作取模运算并将结果压入栈顶'))
container.append((0x74, 'ineg','将栈顶 int 型数值取负并将结果压入栈顶'))
container.append((0x75, 'lneg','将栈顶 long 型数值取负并将结果压入栈顶'))
container.append((0x76, 'fneg','将栈顶 float 型数值取负并将结果压入栈顶'))
container.append((0x77, 'dneg','将栈顶 double 型数值取负并将结果压入栈顶'))
container.append((0x78, 'ishl','将 int 型数值左移位指定位数并将结果压入栈顶'))
container.append((0x79, 'lshl','将 long 型数值左移位指定位数并将结果压入栈顶'))
container.append((0x7a, 'ishr','将 int 型数值右(符号)移位指定位数并将结果压入栈顶'))
container.append((0x7b, 'lshr','将 long 型数值右(符号)移位指定位数并将结果压入栈顶'))
container.append((0x7c, 'iushr','将 int 型数值右(无符号)移位指定位数并将结果压入栈顶'))
container.append((0x7d, 'lushr','将 long 型数值右(无符号)移位指定位数并将结果压入栈顶'))
container.append((0x7e, 'iand','将栈顶两 int 型数值作“按位与”并将结果压入栈顶'))
container.append((0x7f, 'land','将栈顶两 long 型数值作“按位与”并将结果压入栈顶'))
container.append((0x80, 'ior','将栈顶两 int 型数值作“按位或”并将结果压入栈顶'))
container.append((0x81, 'lor','将栈顶两 long 型数值作“按位或”并将结果压入栈顶'))
container.append((0x82, 'ixor','将栈顶两 int 型数值作“按位异或”并将结果压入栈顶'))
container.append((0x83, 'lxor','将栈顶两 long 型数值作“按位异或”并将结果压入栈顶'))
container.append((0x84, 'iinc','将指定 int 型变量增加指定值(i++,'))
container.append((0x85, 'i2l','将栈顶 int 型数值强制转换成 long 型数值并将结果压入栈顶'))
container.append((0x86, 'i2f','将栈顶 int 型数值强制转换成 float 型数值并将结果压入栈顶'))
container.append((0x87, 'i2d','将栈顶 int 型数值强制转换成 double 型数值并将结果压入栈顶'))
container.append((0x88, 'l2i','将栈顶 long 型数值强制转换成 int 型数值并将结果压入栈顶'))
container.append((0x89, 'l2f','将栈顶 long 型数值强制转换成 float 型数值并将结果压入栈顶'))
container.append((0x8a, 'l2d','将栈顶 long 型数值强制转换成 double 型数值并将结果压入栈顶'))
container.append((0x8b, 'f2i','将栈顶 float 型数值强制转换成 int 型数值并将结果压入栈顶'))
container.append((0x8c, 'f2l','将栈顶 float 型数值强制转换成 long 型数值并将结果压入栈顶'))
container.append((0x8d, 'f2d','将栈顶 float 型数值强制转换成 double 型数值并将结果压入栈顶'))
container.append((0x8e, 'd2i','将栈顶 double 型数值强制转换成 int 型数值并将结果压入栈顶'))
container.append((0x8f, 'd2l','将栈顶 double 型数值强制转换成 long 型数值并将结果压入栈顶'))
container.append((0x90, 'd2f','将栈顶 double 型数值强制转换成 float 型数值并将结果压入栈顶'))
container.append((0x91, 'i2b','将栈顶 int 型数值强制转换成 byte 型数值并将结果压入栈顶'))
container.append((0x92, 'i2c','将栈顶 int 型数值强制转换成 char 型数值并将结果压入栈顶'))
container.append((0x93, 'i2s','将栈顶 int 型数值强制转换成 short 型数值并将结果压入栈顶'))
container.append((0x94, 'lcmp','比较栈顶两 long 型数值大小,并将结果(1,0,-1)压入栈顶'))
container.append((0x95, 'fcmpl','比较栈顶两 float 型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为 NaN 时,将 -1 压入栈顶'))
container.append((0x96, 'fcmpg','比较栈顶两 float 型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为 NaN 时,将 1 压入栈顶'))
container.append((0x97, 'dcmpl','比较栈顶两 double 型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为 NaN 时,将 -1 压入栈顶'))
container.append((0x98, 'dcmpg','比较栈顶两 double 型数值大小,并将结果(1,0,-1)压入栈顶;当其中一个数值为 NaN 时,将 1 压入栈顶'))
container.append((0x99, 'ifeq','当栈顶 int 型数值等于 0 时跳转'))
container.append((0x9a, 'ifne','当栈顶 int 型数值不等于 0 时跳转'))
container.append((0x9b, 'iflt','当栈顶 int 型数值小于 0 时跳转'))
container.append((0x9c, 'ifge','当栈顶 int 型数值大于等于 0 时跳转'))
container.append((0x9d, 'ifgt','当栈顶 int 型数值大于 0 时跳转'))
container.append((0x9e, 'ifle','当栈顶 int 型数值小于等于 0 时跳转'))
container.append((0x9f, 'if_icmpeq','比较栈顶两 int 型数值大小,当结果等于 0 时跳转'))
container.append((0xa0, 'if_icmpne','比较栈顶两 int 型数值大小,当结果不等于 0 时跳转'))
container.append((0xa1, 'if_icmplt','比较栈顶两 int 型数值大小,当结果小于 0 时跳转'))
container.append((0xa2, 'if_icmpge','比较栈顶两 int 型数值大小,当结果大于等于 0 时跳转'))
container.append((0xa3, 'if_icmpgt','比较栈顶两 int 型数值大小,当结果大于 0 时跳转'))
container.append((0xa4, 'if_icmple','比较栈顶两 int 型数值大小,当结果小于等于 0 时跳转'))
container.append((0xa5, 'if_acmpeq','比较栈顶两引用型数值,当结果相等时跳转'))
container.append((0xa6, 'if_acmpne','比较栈顶两引用型数值,当结果不相等时跳转'))
container.append((0xa7, 'goto','无条件跳转'))
container.append((0xa8, 'jsr','跳转至指定 16 位 offset 位置,并将 jsr 下一条指令地址压入栈顶'))
container.append((0xa9, 'ret','返回至本地变量指定的 index 的指令位置(一般与 jsr, jsr_w 联合使用)'))
container.append((0xaa, 'tableswitch','用于 switch 条件跳转,case 值连续(可变长度指令)'))
container.append((0xab, 'lookupswitch','用于 switch 条件跳转,case 值不连续(可变长度指令)'))
container.append((0xac, 'ireturn','从当前方法返回 int'))
container.append((0xad, 'lreturn','从当前方法返回 long'))
container.append((0xae, 'freturn','从当前方法返回 float'))
container.append((0xaf, 'dreturn','从当前方法返回 double'))
container.append((0xb0, 'areturn','从当前方法返回对象引用'))
container.append((0xb1, 'return','从当前方法返回void'))
container.append((0xb2, 'getstatic','获取指定类的静态域,并将其值压入栈顶'))
container.append((0xb3, 'putstatic','为指定的类的静态域赋值'))
container.append((0xb4, 'getfield','获取指定类的实例域,并将其值压入栈顶'))
container.append((0xb5, 'putfield','为指定的类的实例域赋值'))
container.append((0xb6, 'invokevirtual','调用实例方法'))
container.append((0xb7, 'invokespecial','调用超类构造方法,实例初始化方法,私有方法'))
container.append((0xb8, 'invokestatic','调用静态方法'))
container.append((0xb9, 'invokeinterface','调用接口方法'))
container.append((0xbb, 'new','创建一个对象,并将其引用值压入栈顶'))
container.append((0xbc, 'newarray','创建一个指定原始类型(如int, float, char…)的数组,并将其引用值压入栈顶'))
container.append((0xbd, 'anewarray','创建一个引用型(如类,接口,数组)的数组,并将其引用值压入栈顶'))
container.append((0xbe, 'arraylength','获得数组的长度值并压入栈顶'))
container.append((0xbf, 'athrow','将栈顶的异常抛出'))
container.append((0xc0, 'checkcast','检验类型转换,检验未通过将抛出 ClassCastException'))
container.append((0xc1, 'instanceof','检验对象是否是指定的类的实例,如果是将 1 压入栈顶,否则将0压入栈顶'))
container.append((0xc2, 'monitorenter','获得对象的锁,用于同步方法或同步块'))
container.append((0xc3, 'monitorexit','释放对象的锁,用于同步方法或同步块'))
container.append((0xc4, 'wide','<待补充>'))
container.append((0xc5, 'multianewarray','创建指定类型和指定维度的多维数组(执行该指令时,操作栈中必须包含各维度的长度值),并将其引用值压入栈顶'))
container.append((0xc6, 'ifnull','为 null 时跳转'))
container.append((0xc7, 'ifnonnull','不为 null 时跳转'))
container.append((0xc8, 'goto_w','无条件跳转(宽索引)'))
container.append((0xc9, 'jsr_w','跳转至指定 32 位 offset 位置,并将 jsr_w 下一条指令地址压入栈顶'))
def wrap(opcode, insn, desc) -> str:
return '--------------------------------------------------------\n'+str(opcode)+' '+insn+' '+desc+'\n--------------------------------------------------------\n'
def search(pattern:str) -> str:
output = ''
code = -1
if pattern.isdigit():
code = int(pattern)
else:
try:
code = int(pattern,base=16)
except Exception:
code = -1
for opcode, insn, desc in container:
if opcode == code:
output = '-----------------------best match------------------------\n'+str(opcode)+' '+insn+' '+desc+'\n----------------------------------------------------------\n' + output
if pattern.lower() in insn:
output = output + wrap(opcode, insn, desc)
elif pattern.lower() in desc:
output = output + wrap(opcode, insn, desc)
return output
if __name__ == '__main__':
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
print(search('{{subinput}}'))