我一直在使用“dis”模块来重新编写一些已编译的脚本(.pyc)。我明白向前跳和绝对跳之间的区别。据我所知,IF语句将以跳转结束:>>> def f():
if a:
print ''
>>> from dis import dis
>>> dis(f)
2 0 LOAD_GLOBAL 0 (a)
3 JUMP_IF_FALSE 9 (to 15)
6 POP_TOP
3 7 LOAD_CONST 1 ('')
10 PRINT_ITEM
11 PRINT_NEWLINE
12 JUMP_FORWARD 1 (to 16)
>> 15 POP_TOP
>> 16 LOAD_CONST 0 (None)
19 RETURN_VALUE
如果if语句在另一个循环的末尾,则会出现JUMP_ABSOLUTE。例如:
^{pr2}$
从我正在阅读的字节码写回代码时,有一个跳转绝对值让我吃惊:121 228 LOAD_FAST 11 (a)
231 LOAD_CONST 9 (100)
234 COMPARE_OP 0 (
237 JUMP_IF_FALSE 23 (to 263)
240 POP_TOP
241 LOAD_FAST 11 (b)
244 LOAD_CONST 11 (10)
247 COMPARE_OP 4 (>)
250 JUMP_IF_FALSE 10 (to 263)
253 POP_TOP
122 254 LOAD_CONST 3 (1)
257 STORE_FAST 4 (ok)
260 JUMP_ABSOLUTE 27
>> 263 POP_TOP
我认为代码如下:if a<100 and b>10:
ok=1
但它会激起一个向前跳,而不是绝对的跳跃。我知道它不是WHILE循环,也不是FOR语句,因为它们都在字节码中创建了一个SETUP\u循环行。在
我的问题是:我错过了什么?为什么我要向前跳而不是绝对跳跃?在
编辑:索引27的绝对跳转指向a(WHILE?)这两条线路121和122属于的环路:106 24 SETUP_LOOP 297 (to 324)
>> 27 LOAD_FAST 4 (ok)
30 LOAD_CONST 1 (0)
33 COMPARE_OP 2 (==)
36 JUMP_IF_FALSE 283 (to 322)
39 POP_TOP
在这些行之前有一个IF语句,后面有一个IF语句。下面是前面的代码,用同样的JUMP_绝对结束语句。在115 170 LOAD_FAST 3 (q)
173 LOAD_CONST 10 (1)
176 COMPARE_OP 0 (
179 JUMP_IF_FALSE 45 (to 227)
182 POP_TOP
183 LOAD_FAST 11 (z)
186 LOAD_CONST 11 (10)
189 COMPARE_OP 4 (>)
192 JUMP_IF_FALSE 32 (to 227)
195 POP_TOP
116 196 LOAD_CONST 1 (0)
199 STORE_FAST 4 (ok)
117 202 LOAD_FAST 5 (u)
205 LOAD_CONST 3 (1)
208 BINARY_ADD
209 STORE_FAST 5 (u)
118 212 LOAD_CONST 1 (0)
215 STORE_FAST 3 (k)
119 218 LOAD_CONST 3 (10)
221 STORE_FAST 6 (dv)
224 JUMP_ABSOLUTE 27
>> 227 POP_TOP
向前跳转表示“转到下一行”,绝对跳转表示“返回WHILE循环的开始”。问题是我不知道如何复制一个与上述字节码相同的代码。在
谢谢你!在