在处理异常的字节码指令时,有一条"26 COMPARE_OP 10"指令,这条指令将比较运行时栈中的那个被捕捉到的异常是否跟except表达式中指定的异常匹配。随后通过一条进行指令跳跃的字节码指令"29 JUMP_IF_FALSE 14 (to 46)"来判断是否需要进行指令跳跃。如果COMPARE_OP的操作结果发现异常匹配,那么JUMP_IF_FALSE就不会进...
10 LOAD_CONST 0 (2) // 导入 2 12 COMPARE_OP 4 (>) // x 与 2 进行比较,比较符号为 > 14 POP_JUMP_IF_FALSE 4 // 不满足条件就跳过 “出栈“ 动作,既,continue 到 " >> 4 FOR_ITER. “处 16 LOAD_FAST 1 (x) // 读取满足条件的局部变量x 18 LIST_APPEND 2 // 把满足条件的x 添...
global 表达式不受LEGB 原则约束;名字引用受LEGB原则约束;属性引用不受约束,可以简单理解为带.的表达式,比如引用其他模块的函数或变量 or 类的成员函数或class 变量引用。 p180:[COMPARE_OP] 代码段中第二个if 判断应该是JUMP_IF_TRUE p185:PyFrameObject 中的 PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* fo...
|-->| | 2|LOAD_CONST | 1|(42) | | | 4|COMPARE_OP | 2|(==) | | | 6|POP_JUMP_IF_FALSE | 12| | | | | | | 3| | | 8|LOAD_CONST | 2|(True) | | | 10|RETURN_VALUE | | | | | | | | 4| |>> | 12|LOAD_CONST | 3|(False) | | | 14|RETURN_VALUE | | ...
0x6A(106): COMPARE_OP 0x6B(107): IMPORT_NAME 0x6C(108): IMPORT_FROM 0x6D(109): <109> 0x6E(110): JUMP_FORWARD 0x6F(111): JUMP_IF_FALSE 0x70(112): JUMP_IF_TRUE 0x71(113): JUMP_ABSOLUTE 0x72(114): <114> 0x73(115): <115> ...
4 COMPARE_OP 2 (==) 6 POP_JUMP_IF_FALSE 20 4 8 LOAD_CONST 1 (100) 10 STORE_NAME 1 (a) 5 12 LOAD_NAME 2 (print) 14 LOAD_NAME 1 (a) 16 CALL_FUNCTION 1 18 POP_TOP >> 20 LOAD_CONST 2 (None) 22 RETURN_VALUE consts ...
dis.dis(f1)# dis 执行结果50LOAD_FAST0(delta_seconds)2LOAD_CONST1(950400)4COMPARE_OP0(<)6POP_JUMP_IF_FALSE1268LOAD_CONST0(None)10RETURN_VALUE>>12LOAD_CONST0(None)14RETURN_VALUE 看见上面的2 LOAD_CONST 1 (950400)了吗?这表示 Python 解释器在将源码编译成成字节码时,会计算11 * 24 * 3600...
LOAD_FAST,LOAD_CONST,COMPARE_OP 以及 POP_JUMP_IF_FALSE. x<5 生成代码去装载 x 然后比较 2 个数字。 POP_JUMP_IF_FALSE 指令负责实现 If. 这个指令会将解释器的栈顶元素出栈。如果这个值为真,那么什么都不会发生。如果这个值为 False ,解释器将会跳转到其他的指令。
第14行字节码 COMPARE_OP 是二元运算符,对最靠近栈顶的两个数值元素出栈并执行比较,此处是比较 (a < b) ,得到结果是 False ,栈变成了 [(False), print, b] 。第20行 JUMP_IF_FALSE_OR_POP 是条件控制的关键,如果栈顶是 False 则跳转第46行字节码,否则弹出栈顶并继续运行,此处栈顶是 False 执行跳转...
6 COMPARE_OP 2 (==) 9 POP_JUMP_IF_FALSE 20 12 LOAD_CONST 3 (3) 15 LOAD_BUILD_CLASS 16 YIELD_FROM 17 JUMP_FORWARD 0 (to 20) >> 20 LOAD_CONST 0 (0) 23 RETURN_VALUE 常见的字节码指令 为了进一步研究OpCode,我们可以对dis的disassemble_string函数进行patch ...