Python 2.6.2的.pyc文件格式
2010-09-22 11:25:54 来源:WEB开发网核心提示: 根据本文前半部分的分析,顶层代码的字节码长度是0x66=102字节,Python 2.6.2的.pyc文件格式(4),位于0x1E-0x83这个范围内,有兴趣的同学可以参考Python指令集列表来试试自行解读字节码指令,自己分析嫌麻烦的话让dis帮忙解决就行: (下面代码中,dis.dis
根据本文前半部分的分析,顶层代码的字节码长度是0x66=102字节,位于0x1E-0x83这个范围内。有兴趣的同学可以参考Python指令集列表来试试自行解读字节码指令。
看到字节码的开头,首先是0x64,这是一个LOAD_CONST指令,有参数,所以接着看后面两个字节,0x00 0x00,也就是参数为0(注意little-endian字节序)。LOAD_CONST 0,也就是把常量池下标为0的对象压到求值栈上。
接下来又是0x64,连上参数的0x05 0x00,就是LOAD_CONST 5,也就是把常量池下标为5的对象压到求值栈上。
后面的字节码也可依法类推辨认出来。
事实上Python标准库里已经有提取字节码的库,dis模块。自己分析嫌麻烦的话让dis帮忙解决就行:
(下面代码中,dis.dis(code)的结果就是顶层代码对象中的字节码,
格式:行号 偏移量 指令名 参数(括号内为参数的注解))
Python interactive代码
E:Python26>python
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis, marshal
>>> f = open('demo.pyc', 'rb')
>>> magic = f.read(4)
>>> mtime = f.read(4)
>>> code = marshal.load(f)
>>> dis.dis(code)
1 0 LOAD_CONST 0 ('A')
3 LOAD_CONST 5 (())
6 LOAD_CONST 1 (<code object A at 01707EC0, file "demo.py", line 1>)
9 MAKE_FUNCTION 0
12 CALL_FUNCTION 0
15 BUILD_CLASS
16 STORE_NAME 0 (A)
4 19 LOAD_NAME 0 (A)
22 LOAD_ATTR 1 (x)
25 PRINT_ITEM
26 PRINT_NEWLINE
7 27 LOAD_NAME 0 (A)
30 DUP_TOP
31 LOAD_ATTR 1 (x)
34 LOAD_CONST 2 (2)
37 INPLACE_ADD
38 ROT_TWO
39 STORE_ATTR 1 (x)
8 42 LOAD_NAME 0 (A)
45 LOAD_ATTR 1 (x)
48 PRINT_ITEM
49 PRINT_NEWLINE
11 50 LOAD_NAME 0 (A)
53 CALL_FUNCTION 0
56 STORE_NAME 2 (a)
12 59 LOAD_NAME 2 (a)
62 LOAD_ATTR 1 (x)
65 PRINT_ITEM
66 PRINT_NEWLINE
15 67 LOAD_NAME 2 (a)
70 DUP_TOP
71 LOAD_ATTR 1 (x)
74 LOAD_CONST 3 (4)
77 INPLACE_ADD
78 ROT_TWO
79 STORE_ATTR 1 (x)
16 82 LOAD_NAME 2 (a)
85 LOAD_ATTR 1 (x)
88 PRINT_ITEM
89 PRINT_NEWLINE
17 90 LOAD_NAME 0 (A)
93 LOAD_ATTR 1 (x)
96 PRINT_ITEM
97 PRINT_NEWLINE
98 LOAD_CONST 4 (None)
101 RETURN_VALUE
>>> quit()
P.S. 其实这文单独看挺火星的……我是为了让另外一帖更干净些才把分析.pyc文件格式的部分拆了出来。
更多精彩
赞助商链接