python 字节码死磕
- python代码编译成字节码【类似于汇编指令的中间语言】
- 字节码由python虚拟机来执行编译后的字节码
源码行号 | 指令偏移量 | 指令符号 | 指令参数 | 实际参数值
test(2,'hello')
1 0 LOAD_NAME 0 (test)
2 LOAD_CONST 0 (2)
4 LOAD_CONST 1 ('hello')
6 CALL_FUNCTION 2
8 POP_TOP
10 LOAD_CONST 2 (None)
12 RETURN_VALUE
n = n / p
1 0 LOAD_NAME 0 (n)
2 LOAD_NAME 1 (p)
4 BINARY_TRUE_DIVIDE
6 STORE_NAME 0 (n)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
def test(arg1):
num = 0
print(num, arg1)
1 0 LOAD_CONST 0 (<code object test at 0x10546c150, file "code.py", line 1>)
2 LOAD_CONST 1 ('test')
4 MAKE_FUNCTION 0
6 STORE_NAME 0 (test)
8 LOAD_CONST 2 (None)
10 RETURN_VALUE Disassembly of <code object test at 0x10546c150, file "code.py", line 1>:
2 0 LOAD_CONST 1 (0)
2 STORE_FAST 1 (num) 3 4 LOAD_GLOBAL 0 (print)
6 LOAD_FAST 1 (num)
8 LOAD_FAST 0 (arg1). #只有LOAD_FAST ,没有 STORE_FAST
10 CALL_FUNCTION 2
12 POP_TOP
14 LOAD_CONST 0 (None)
16 RETURN_VALUE
def test(arg1):
global age
age = 20
print(age)
1 0 LOAD_CONST 0 (<code object test at 0x1056e3150, file "code.py", line 1>)
2 LOAD_CONST 1 ('test')
4 MAKE_FUNCTION 0
6 STORE_NAME 0 (test)
8 LOAD_CONST 2 (None)
10 RETURN_VALUE Disassembly of <code object test at 0x1056e3150, file "code.py", line 1>:
3 0 LOAD_CONST 1 (20)
2 STORE_GLOBAL 0 (age) 4 4 LOAD_GLOBAL 1 (print)
6 LOAD_GLOBAL 0 (age)
8 CALL_FUNCTION 1
10 POP_TOP
12 LOAD_CONST 0 (None)
14 RETURN_VALUE
a = [1, 2]
1 0 LOAD_CONST 0 (1)
2 LOAD_CONST 1 (2)
4 BUILD_LIST 2
6 STORE_NAME 0 (a)
8 LOAD_CONST 2 (None)
10 RETURN_VALUE //程序结束
[ x for x in range(4) if x > 2 ]
1 0 LOAD_CONST 0 (<code object <listcomp> at 0x10bffa150, file "code.py", line 1>)
2 LOAD_CONST 1 ('<listcomp>')
4 MAKE_FUNCTION 0
6 LOAD_NAME 0 (range)
8 LOAD_CONST 2 (4)
10 CALL_FUNCTION 1
12 GET_ITER
14 CALL_FUNCTION 1
16 POP_TOP
18 LOAD_CONST 3 (None)
20 RETURN_VALUE Disassembly of <code object <listcomp> at 0x10bffa150, file "code.py", line 1>:
1 0 BUILD_LIST 0 //创建 list , 为赋值给某变量,这种时候一般都是语法糖结构了
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 16 (to 22) //开启迭代循环
6 STORE_FAST 1 (x) //局部变量x
8 LOAD_FAST 1 (x) // 导入 x
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 添加到list中
20 JUMP_ABSOLUTE 4
>> 22 RETURN_VALUE //程序结束
k = {'a': 1}
1 0 LOAD_CONST 0 ('a')
2 LOAD_CONST 1 (1)
4 BUILD_MAP 1
6 STORE_NAME 0 (k)
8 LOAD_CONST 2 (None)
10 RETURN_VALUE
num = [1, 2, 3]
a = num[1:2]
b = num[0:1:1]
num[1:2] = [10, 11]
1 0 LOAD_CONST 0 (1)
2 LOAD_CONST 1 (2)
4 LOAD_CONST 2 (3)
6 BUILD_LIST 3
8 STORE_NAME 0 (num) 2 10 LOAD_NAME 0 (num)
12 LOAD_CONST 0 (1)
14 LOAD_CONST 1 (2)
16 BUILD_SLICE 2 #创建了一个切片
18 BINARY_SUBSCR #读取切片中的值
20 STORE_NAME 1 (a) #将读取切片中的值赋值给变量 a 3 22 LOAD_NAME 0 (num)
24 LOAD_CONST 3 (0)
26 LOAD_CONST 0 (1)
28 LOAD_CONST 0 (1)
30 BUILD_SLICE 3
32 BINARY_SUBSCR
34 STORE_NAME 2 (b) 4 36 LOAD_CONST 4 (10)
38 LOAD_CONST 5 (11)
40 BUILD_LIST 2
42 LOAD_NAME 0 (num)
44 LOAD_CONST 0 (1)
46 LOAD_CONST 1 (2)
48 BUILD_SLICE 2
50 STORE_SUBSCR
52 LOAD_CONST 6 (None)
54 RETURN_VALUE
i = 0
while i < 10:
i += 1
1 0 LOAD_CONST 0 (0)
2 STORE_NAME 0 (i) 2 4 SETUP_LOOP 20 (to 26) // 循环开始处,26表示循环结束点
>> 6 LOAD_NAME 0 (i) // “>>" 表示循环切入点
8 LOAD_CONST 1 (10)
10 COMPARE_OP 0 (<)
12 POP_JUMP_IF_FALSE 24 3 14 LOAD_NAME 0 (i)
16 LOAD_CONST 2 (1)
18 INPLACE_ADD
20 STORE_NAME 0 (i)
22 JUMP_ABSOLUTE 6 // 逻辑上,循环在此处结束
>> 24 POP_BLOCK
>> 26 LOAD_CONST 3 (None)
28 RETURN_VALUE
num = 0
for i in range(5):
num += i
对应的字节码
1 0 LOAD_CONST 0 (0)
2 STORE_NAME 0 (num) 2 4 SETUP_LOOP 24 (to 30) //开始循环
6 LOAD_NAME 1 (range)
8 LOAD_CONST 1 (5)
10 CALL_FUNCTION 1 //调用range 函数
12 GET_ITER //获取迭代 range 的 iter
>> 14 FOR_ITER 12 (to 28) //开始进行 range 的迭代
16 STORE_NAME 2 (i) 3 18 LOAD_NAME 0 (num)
20 LOAD_NAME 2 (i)
22 INPLACE_ADD
24 STORE_NAME 0 (num)
26 JUMP_ABSOLUTE 14
>> 28 POP_BLOCK
>> 30 LOAD_CONST 2 (None)
32 RETURN_VALUE
num = 20
if num < 10:
print('lt 10')
elif num > 10:
print('gt 10')
else:
print('eq 10')
1 0 LOAD_CONST 0 (20)
2 STORE_NAME 0 (num) 2 4 LOAD_NAME 0 (num)
6 LOAD_CONST 1 (10)
8 COMPARE_OP 0 (<)
10 POP_JUMP_IF_FALSE 22 3 12 LOAD_NAME 1 (print)
14 LOAD_CONST 2 ('lt 10')
16 CALL_FUNCTION 1
18 POP_TOP
20 JUMP_FORWARD 26 (to 48) 4 >> 22 LOAD_NAME 0 (num)
24 LOAD_CONST 1 (10)
26 COMPARE_OP 4 (>)
28 POP_JUMP_IF_FALSE 40 5 30 LOAD_NAME 1 (print)
32 LOAD_CONST 3 ('gt 10')
34 CALL_FUNCTION 1
36 POP_TOP
38 JUMP_FORWARD 8 (to 48) 7 >> 40 LOAD_NAME 1 (print)
42 LOAD_CONST 4 ('eq 10')
44 CALL_FUNCTION 1
46 POP_TOP
>> 48 LOAD_CONST 5 (None)
50 RETURN_VALUE
参考资料:
python 字节码死磕的更多相关文章
- JAVA NIO 简介 (netty源码死磕1.1)
[基础篇]netty 源码死磕1.1: JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...
- Java NIO Buffer(netty源码死磕1.2)
[基础篇]netty源码死磕1.2: NIO Buffer 1. Java NIO Buffer Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.Buffer缓冲区本质上是一块可 ...
- Python 字节码是什么
了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...
- 浮生半日:探究Python字节码
好吧!“人生苦短,请用Python”,作为python爱好者以及安全从业者,而且最近也碰到了一些这方面的问题,懂点python字节码还是很有必要的. Python是一门解释性语言,它的具体工作流程如下 ...
- Netty环境搭建 (源码死磕2)
[正文]netty源码 死磕2: 环境搭建 本小节目录 1. Netty为什么火得屌炸天? 1.1. Netty是什么? 1.2. Netty火到什么程度呢? 1.3. Netty为什么这么火? 2 ...
- EventLoop(netty源码死磕4)
精进篇:netty源码 死磕4-EventLoop的鬼斧神工 目录 1. EventLoop的鬼斧神工 2. 初识 EventLoop 3. Reactor模式回顾 3.1. Reactor模式的组 ...
- Pipeline模式(netty源码死磕6)
精进篇:netty源码死磕6 巧夺天工--Pipeline模式揭秘 1. 巧夺天工--Pipeline模式揭秘 1.1. Pipeline模式简介 管道的发名者叫,Malcolm Douglas M ...
- ChannelHandler揭秘(Netty源码死磕5)
精进篇:netty源码死磕5 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4. ...
- Python逆向(五)—— Python字节码解读
一.前言 前些章节我们对python编译.反汇编的原理及相关模块已经做了解读.读者应该初步掌握了通过反汇编获取python程序可读字节码的能力.python逆向或者反汇编的目的就是在没有源码的基础上, ...
随机推荐
- VMWARE虚拟机安装系统提示CPU已被客户机操作系统禁用和secureCUT乱码
错误:VMWARE虚拟机安装系统提示CPU已被客户机操作系统禁用 改正:找到虚拟机的位置找到下图灰色的部分:打开 .vmx后缀的操作系统配置文件,加入以下代码: cpuid.1.eax = :: 2. ...
- 全国职业技能大赛信息安全管理与评估-第三阶段-弱口令自动爆破+读取Flag脚本
自动爆破SSH弱口令+读取Flag #coding=utf-8 import paramiko sshc = paramiko.SSHClient() sshc.set_missing_host_ke ...
- 最大比率传输(Maximum Ratio Transmission, MRT)原理分析
转载请注明出处. 最大比率发射(Maximum Ratio Transmission, MRT)是文献中经常看见的一个词,今天就在这里做一下笔记. 参考文献为:T. K. Y. Lo, "M ...
- 【笔记3-24】Python语言基础
环境搭建与语法入门 遇到问题解决问题 积累 英语单词 认真听讲,多敲代码 计算机是什么 计算机的组成 计算机的使用方式 TUI文本交互 GUI图形化交互 windows 的命令行 Shell.Term ...
- Python电影数据分析
数据说明:MovieLens数据集,它包含来自于943个用户以及精选的1682部电影的100K个电影打分.每个用户至少为20部电影打分,数据类型user id | item id | rating | ...
- Redis学习笔记2-redis管道(pipeline)
redis的管道(Pipelining)操作是一种异步的访问模式,一次发送多个指令,不同步等待其返回结果.这样可以取得非常好的执行效率.这就是管道,调用方法如下: 来源:http://blog.csd ...
- 10行Python代码实现目标检测
要知道图像中的目标是什么? 或者你想数一幅图里有多少个苹果? 在本文中,我将向你展示如何使用Python在不到10行代码中创建自己的目标检测程序. 如果尚未安装python库,你需要安装以下pytho ...
- HDU - 1317 ~ SPFA正权回路的判断
题意:有最多一百个房间,房间之间连通,到达另一个房间会消耗能量值或者增加能量值,求是否能从一号房间到达n号房间. 看数据,有定5个房间,下面有5行,第 iii 行代表 iii 号 房间的信息,第一个数 ...
- Kaggle竞赛入门:决策树算法的Python实现
本文翻译自kaggle learn,也就是kaggle官方最快入门kaggle竞赛的教程,强调python编程实践和数学思想(而没有涉及数学细节),笔者在不影响算法和程序理解的基础上删除了一些不必要的 ...
- coding++:事务管理 隔离级别
在声明事务时,只需要通过value属性指定配置的事务管理器名即可,例如:@Transactional(value="transactionManagerPrimary"). 除了指 ...