python 字节码

python 的opcode 模块中定义了所有的字节码:

In [1]: import opcode
   ...: for i in range(len(opcode.opname)):
   ...:      print("0x%2x(%03d): %s" % (i, i, opcode.opname[i]))
   ...:
0x 0(000): <0>
0x 1(001): POP_TOP
0x 2(002): ROT_TWO
0x 3(003): ROT_THREE
0x 4(004): DUP_TOP
0x 5(005): DUP_TOP_TWO
0x 6(006): <6>
0x 7(007): <7>
0x 8(008): <8>
0x 9(009): NOP
0x a(010): UNARY_POSITIVE
0x b(011): UNARY_NEGATIVE
0x c(012): UNARY_NOT
0x d(013): <13>
0x e(014): <14>
0x f(015): UNARY_INVERT
0x10(016): BINARY_MATRIX_MULTIPLY
0x11(017): INPLACE_MATRIX_MULTIPLY
0x12(018): <18>
0x13(019): BINARY_POWER
0x14(020): BINARY_MULTIPLY
0x15(021): <21>
0x16(022): BINARY_MODULO
0x17(023): BINARY_ADD
0x18(024): BINARY_SUBTRACT
0x19(025): BINARY_SUBSCR
0x1a(026): BINARY_FLOOR_DIVIDE
0x1b(027): BINARY_TRUE_DIVIDE
0x1c(028): INPLACE_FLOOR_DIVIDE
0x1d(029): INPLACE_TRUE_DIVIDE
0x1e(030): <30>
0x1f(031): <31>
0x20(032): <32>
0x21(033): <33>
0x22(034): <34>
0x23(035): <35>
0x24(036): <36>
0x25(037): <37>
0x26(038): <38>
0x27(039): <39>
0x28(040): <40>
0x29(041): <41>
0x2a(042): <42>
0x2b(043): <43>
0x2c(044): <44>
0x2d(045): <45>
0x2e(046): <46>
0x2f(047): <47>
0x30(048): <48>
0x31(049): <49>
0x32(050): GET_AITER
0x33(051): GET_ANEXT
0x34(052): BEFORE_ASYNC_WITH
0x35(053): <53>
0x36(054): <54>
0x37(055): INPLACE_ADD
0x38(056): INPLACE_SUBTRACT
0x39(057): INPLACE_MULTIPLY
0x3a(058): <58>
0x3b(059): INPLACE_MODULO
0x3c(060): STORE_SUBSCR
0x3d(061): DELETE_SUBSCR
0x3e(062): BINARY_LSHIFT
0x3f(063): BINARY_RSHIFT
0x40(064): BINARY_AND
0x41(065): BINARY_XOR
0x42(066): BINARY_OR
0x43(067): INPLACE_POWER
0x44(068): GET_ITER
0x45(069): GET_YIELD_FROM_ITER
0x46(070): PRINT_EXPR
0x47(071): LOAD_BUILD_CLASS
0x48(072): YIELD_FROM
0x49(073): GET_AWAITABLE
0x4a(074): <74>
0x4b(075): INPLACE_LSHIFT
0x4c(076): INPLACE_RSHIFT
0x4d(077): INPLACE_AND
0x4e(078): INPLACE_XOR
0x4f(079): INPLACE_OR
0x50(080): BREAK_LOOP
0x51(081): WITH_CLEANUP_START
0x52(082): WITH_CLEANUP_FINISH
0x53(083): RETURN_VALUE
0x54(084): IMPORT_STAR
0x55(085): SETUP_ANNOTATIONS
0x56(086): YIELD_VALUE
0x57(087): POP_BLOCK
0x58(088): END_FINALLY
0x59(089): POP_EXCEPT
0x5a(090): STORE_NAME
0x5b(091): DELETE_NAME
0x5c(092): UNPACK_SEQUENCE
0x5d(093): FOR_ITER
0x5e(094): UNPACK_EX
0x5f(095): STORE_ATTR
0x60(096): DELETE_ATTR
0x61(097): STORE_GLOBAL
0x62(098): DELETE_GLOBAL
0x63(099): <99>
0x64(100): LOAD_CONST
0x65(101): LOAD_NAME
0x66(102): BUILD_TUPLE
0x67(103): BUILD_LIST
0x68(104): BUILD_SET
0x69(105): BUILD_MAP
0x6a(106): LOAD_ATTR
0x6b(107): COMPARE_OP
0x6c(108): IMPORT_NAME
0x6d(109): IMPORT_FROM
0x6e(110): JUMP_FORWARD
0x6f(111): JUMP_IF_FALSE_OR_POP
0x70(112): JUMP_IF_TRUE_OR_POP
0x71(113): JUMP_ABSOLUTE
0x72(114): POP_JUMP_IF_FALSE
0x73(115): POP_JUMP_IF_TRUE
0x74(116): LOAD_GLOBAL
0x75(117): <117>
0x76(118): <118>
0x77(119): CONTINUE_LOOP
0x78(120): SETUP_LOOP
0x79(121): SETUP_EXCEPT
0x7a(122): SETUP_FINALLY
0x7b(123): <123>
0x7c(124): LOAD_FAST
0x7d(125): STORE_FAST
0x7e(126): DELETE_FAST
0x7f(127): STORE_ANNOTATION
0x80(128): <128>
0x81(129): <129>
0x82(130): RAISE_VARARGS
0x83(131): CALL_FUNCTION
0x84(132): MAKE_FUNCTION
0x85(133): BUILD_SLICE
0x86(134): <134>
0x87(135): LOAD_CLOSURE
0x88(136): LOAD_DEREF
0x89(137): STORE_DEREF
0x8a(138): DELETE_DEREF
0x8b(139): <139>
0x8c(140): <140>
0x8d(141): CALL_FUNCTION_KW
0x8e(142): CALL_FUNCTION_EX
0x8f(143): SETUP_WITH
0x90(144): EXTENDED_ARG
0x91(145): LIST_APPEND
0x92(146): SET_ADD
0x93(147): MAP_ADD
0x94(148): LOAD_CLASSDEREF
0x95(149): BUILD_LIST_UNPACK
0x96(150): BUILD_MAP_UNPACK
0x97(151): BUILD_MAP_UNPACK_WITH_CALL
0x98(152): BUILD_TUPLE_UNPACK
0x99(153): BUILD_SET_UNPACK
0x9a(154): SETUP_ASYNC_WITH
0x9b(155): FORMAT_VALUE
0x9c(156): BUILD_CONST_KEY_MAP
0x9d(157): BUILD_STRING
0x9e(158): BUILD_TUPLE_UNPACK_WITH_CALL
0x9f(159): <159>
0xa0(160): <160>
0xa1(161): <161>
0xa2(162): <162>
0xa3(163): <163>
0xa4(164): <164>
0xa5(165): <165>
0xa6(166): <166>
0xa7(167): <167>
0xa8(168): <168>
0xa9(169): <169>
0xaa(170): <170>
0xab(171): <171>
0xac(172): <172>
0xad(173): <173>
0xae(174): <174>
0xaf(175): <175>
0xb0(176): <176>
0xb1(177): <177>
0xb2(178): <178>
0xb3(179): <179>
0xb4(180): <180>
0xb5(181): <181>
0xb6(182): <182>
0xb7(183): <183>
0xb8(184): <184>
0xb9(185): <185>
0xba(186): <186>
0xbb(187): <187>
0xbc(188): <188>
0xbd(189): <189>
0xbe(190): <190>
0xbf(191): <191>
0xc0(192): <192>
0xc1(193): <193>
0xc2(194): <194>
0xc3(195): <195>
0xc4(196): <196>
0xc5(197): <197>
0xc6(198): <198>
0xc7(199): <199>
0xc8(200): <200>
0xc9(201): <201>
0xca(202): <202>
0xcb(203): <203>
0xcc(204): <204>
0xcd(205): <205>
0xce(206): <206>
0xcf(207): <207>
0xd0(208): <208>
0xd1(209): <209>
0xd2(210): <210>
0xd3(211): <211>
0xd4(212): <212>
0xd5(213): <213>
0xd6(214): <214>
0xd7(215): <215>
0xd8(216): <216>
0xd9(217): <217>
0xda(218): <218>
0xdb(219): <219>
0xdc(220): <220>
0xdd(221): <221>
0xde(222): <222>
0xdf(223): <223>
0xe0(224): <224>
0xe1(225): <225>
0xe2(226): <226>
0xe3(227): <227>
0xe4(228): <228>
0xe5(229): <229>
0xe6(230): <230>
0xe7(231): <231>
0xe8(232): <232>
0xe9(233): <233>
0xea(234): <234>
0xeb(235): <235>
0xec(236): <236>
0xed(237): <237>
0xee(238): <238>
0xef(239): <239>
0xf0(240): <240>
0xf1(241): <241>
0xf2(242): <242>
0xf3(243): <243>
0xf4(244): <244>
0xf5(245): <245>
0xf6(246): <246>
0xf7(247): <247>
0xf8(248): <248>
0xf9(249): <249>
0xfa(250): <250>
0xfb(251): <251>
0xfc(252): <252>
0xfd(253): <253>
0xfe(254): <254>
0xff(255): <255>

包括保留的,一共只有256个不同的字节码(所以叫字节码,一个字节即能表示全部),实际使用到的有118个,未被使用的用 "<n>" 表示。

操作码序号不小于90的才有操作数,使用 opcode.HAVE_ARGUMENT 标记。

In [10]: def func(a, b):
    ...:     return a + b
    ...:

In [11]: import dis

In [12]: dis.dis(func)
  2           0 LOAD_FAST                0 (a)
              2 LOAD_FAST                1 (b)
              4 BINARY_ADD
              6 RETURN_VALUE

In [13]: c = func.__code__

In [14]: co_code = c.co_code

In [15]: co_code
Out[15]: b'|\x00|\x01\x17\x00S\x00'

dis 模块用来查看对应的字节码,code 对象可以用来查看最终的二进制码。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值