cs107-lecture-examples

Example codes used during Harvard CS107 lectures
git clone https://git.0xfab.ch/cs107-lecture-examples.git
Log | Files | Refs | README | LICENSE

opcode_oparg.py (7177B)


      1 #!/usr/bin/env python3
      2 
      3 def f():
      4     x0 = 0.0
      5     x1 = 1.1
      6     x2 = 2.2
      7     x3 = 3.3
      8     x4 = 4.4
      9     x5 = 5.5
     10     x6 = 6.6
     11     x7 = 7.7
     12     x8 = 8.8
     13     x9 = 9.9
     14     x10 = 10.10
     15     x11 = 11.11
     16     x12 = 12.12
     17     x13 = 13.13
     18     x14 = 14.14
     19     x15 = 15.15
     20     x16 = 16.16
     21     x17 = 17.17
     22     x18 = 18.18
     23     x19 = 19.19
     24     x20 = 20.20
     25     x21 = 21.21
     26     x22 = 22.22
     27     x23 = 23.23
     28     x24 = 24.24
     29     x25 = 25.25
     30     x26 = 26.26
     31     x27 = 27.27
     32     x28 = 28.28
     33     x29 = 29.29
     34     x30 = 30.30
     35     x31 = 31.31
     36     x32 = 32.32
     37     x33 = 33.33
     38     x34 = 34.34
     39     x35 = 35.35
     40     x36 = 36.36
     41     x37 = 37.37
     42     x38 = 38.38
     43     x39 = 39.39
     44     x40 = 40.40
     45     x41 = 41.41
     46     x42 = 42.42
     47     x43 = 43.43
     48     x44 = 44.44
     49     x45 = 45.45
     50     x46 = 46.46
     51     x47 = 47.47
     52     x48 = 48.48
     53     x49 = 49.49
     54     x50 = 50.50
     55     x51 = 51.51
     56     x52 = 52.52
     57     x53 = 53.53
     58     x54 = 54.54
     59     x55 = 55.55
     60     x56 = 56.56
     61     x57 = 57.57
     62     x58 = 58.58
     63     x59 = 59.59
     64     x60 = 60.60
     65     x61 = 61.61
     66     x62 = 62.62
     67     x63 = 63.63
     68     x64 = 64.64
     69     x65 = 65.65
     70     x66 = 66.66
     71     x67 = 67.67
     72     x68 = 68.68
     73     x69 = 69.69
     74     x70 = 70.70
     75     x71 = 71.71
     76     x72 = 72.72
     77     x73 = 73.73
     78     x74 = 74.74
     79     x75 = 75.75
     80     x76 = 76.76
     81     x77 = 77.77
     82     x78 = 78.78
     83     x79 = 79.79
     84     x80 = 80.80
     85     x81 = 81.81
     86     x82 = 82.82
     87     x83 = 83.83
     88     x84 = 84.84
     89     x85 = 85.85
     90     x86 = 86.86
     91     x87 = 87.87
     92     x88 = 88.88
     93     x89 = 89.89
     94     x90 = 90.90
     95     x91 = 91.91
     96     x92 = 92.92
     97     x93 = 93.93
     98     x94 = 94.94
     99     x95 = 95.95
    100     x96 = 96.96
    101     x97 = 97.97
    102     x98 = 98.98
    103     x99 = 99.99
    104     x100 = 100.100
    105     x101 = 101.101
    106     x102 = 102.102
    107     x103 = 103.103
    108     x104 = 104.104
    109     x105 = 105.105
    110     x106 = 106.106
    111     x107 = 107.107
    112     x108 = 108.108
    113     x109 = 109.109
    114     x110 = 110.110
    115     x111 = 111.111
    116     x112 = 112.112
    117     x113 = 113.113
    118     x114 = 114.114
    119     x115 = 115.115
    120     x116 = 116.116
    121     x117 = 117.117
    122     x118 = 118.118
    123     x119 = 119.119
    124     x120 = 120.120
    125     x121 = 121.121
    126     x122 = 122.122
    127     x123 = 123.123
    128     x124 = 124.124
    129     x125 = 125.125
    130     x126 = 126.126
    131     x127 = 127.127
    132     x128 = 128.128
    133     x129 = 129.129
    134     x130 = 130.130
    135     x131 = 131.131
    136     x132 = 132.132
    137     x133 = 133.133
    138     x134 = 134.134
    139     x135 = 135.135
    140     x136 = 136.136
    141     x137 = 137.137
    142     x138 = 138.138
    143     x139 = 139.139
    144     x140 = 140.140
    145     x141 = 141.141
    146     x142 = 142.142
    147     x143 = 143.143
    148     x144 = 144.144
    149     x145 = 145.145
    150     x146 = 146.146
    151     x147 = 147.147
    152     x148 = 148.148
    153     x149 = 149.149
    154     x150 = 150.150
    155     x151 = 151.151
    156     x152 = 152.152
    157     x153 = 153.153
    158     x154 = 154.154
    159     x155 = 155.155
    160     x156 = 156.156
    161     x157 = 157.157
    162     x158 = 158.158
    163     x159 = 159.159
    164     x160 = 160.160
    165     x161 = 161.161
    166     x162 = 162.162
    167     x163 = 163.163
    168     x164 = 164.164
    169     x165 = 165.165
    170     x166 = 166.166
    171     x167 = 167.167
    172     x168 = 168.168
    173     x169 = 169.169
    174     x170 = 170.170
    175     x171 = 171.171
    176     x172 = 172.172
    177     x173 = 173.173
    178     x174 = 174.174
    179     x175 = 175.175
    180     x176 = 176.176
    181     x177 = 177.177
    182     x178 = 178.178
    183     x179 = 179.179
    184     x180 = 180.180
    185     x181 = 181.181
    186     x182 = 182.182
    187     x183 = 183.183
    188     x184 = 184.184
    189     x185 = 185.185
    190     x186 = 186.186
    191     x187 = 187.187
    192     x188 = 188.188
    193     x189 = 189.189
    194     x190 = 190.190
    195     x191 = 191.191
    196     x192 = 192.192
    197     x193 = 193.193
    198     x194 = 194.194
    199     x195 = 195.195
    200     x196 = 196.196
    201     x197 = 197.197
    202     x198 = 198.198
    203     x199 = 199.199
    204     x200 = 200.200
    205     x201 = 201.201
    206     x202 = 202.202
    207     x203 = 203.203
    208     x204 = 204.204
    209     x205 = 205.205
    210     x206 = 206.206
    211     x207 = 207.207
    212     x208 = 208.208
    213     x209 = 209.209
    214     x210 = 210.210
    215     x211 = 211.211
    216     x212 = 212.212
    217     x213 = 213.213
    218     x214 = 214.214
    219     x215 = 215.215
    220     x216 = 216.216
    221     x217 = 217.217
    222     x218 = 218.218
    223     x219 = 219.219
    224     x220 = 220.220
    225     x221 = 221.221
    226     x222 = 222.222
    227     x223 = 223.223
    228     x224 = 224.224
    229     x225 = 225.225
    230     x226 = 226.226
    231     x227 = 227.227
    232     x228 = 228.228
    233     x229 = 229.229
    234     x230 = 230.230
    235     x231 = 231.231
    236     x232 = 232.232
    237     x233 = 233.233
    238     x234 = 234.234
    239     x235 = 235.235
    240     x236 = 236.236
    241     x237 = 237.237
    242     x238 = 238.238
    243     x239 = 239.239
    244     x240 = 240.240
    245     x241 = 241.241
    246     x242 = 242.242
    247     x243 = 243.243
    248     x244 = 244.244
    249     x245 = 245.245
    250     x246 = 246.246
    251     x247 = 247.247
    252     x248 = 248.248
    253     x249 = 249.249
    254     x250 = 250.250
    255     x251 = 251.251
    256     x252 = 252.252
    257     x253 = 253.253
    258     x254 = 254.254
    259     x255 = 255.255
    260     x256 = 256.256
    261     x257 = 257.257
    262     return x0 + x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23 + x24 + x25 + x26 + x27 + x28 + x29 + x30 + x31 + x32 + x33 + x34 + x35 + x36 + x37 + x38 + x39 + x40 + x41 + x42 + x43 + x44 + x45 + x46 + x47 + x48 + x49 + x50 + x51 + x52 + x53 + x54 + x55 + x56 + x57 + x58 + x59 + x60 + x61 + x62 + x63 + x64 + x65 + x66 + x67 + x68 + x69 + x70 + x71 + x72 + x73 + x74 + x75 + x76 + x77 + x78 + x79 + x80 + x81 + x82 + x83 + x84 + x85 + x86 + x87 + x88 + x89 + x90 + x91 + x92 + x93 + x94 + x95 + x96 + x97 + x98 + x99 + x100 + x101 + x102 + x103 + x104 + x105 + x106 + x107 + x108 + x109 + x110 + x111 + x112 + x113 + x114 + x115 + x116 + x117 + x118 + x119 + x120 + x121 + x122 + x123 + x124 + x125 + x126 + x127 + x128 + x129 + x130 + x131 + x132 + x133 + x134 + x135 + x136 + x137 + x138 + x139 + x140 + x141 + x142 + x143 + x144 + x145 + x146 + x147 + x148 + x149 + x150 + x151 + x152 + x153 + x154 + x155 + x156 + x157 + x158 + x159 + x160 + x161 + x162 + x163 + x164 + x165 + x166 + x167 + x168 + x169 + x170 + x171 + x172 + x173 + x174 + x175 + x176 + x177 + x178 + x179 + x180 + x181 + x182 + x183 + x184 + x185 + x186 + x187 + x188 + x189 + x190 + x191 + x192 + x193 + x194 + x195 + x196 + x197 + x198 + x199 + x200 + x201 + x202 + x203 + x204 + x205 + x206 + x207 + x208 + x209 + x210 + x211 + x212 + x213 + x214 + x215 + x216 + x217 + x218 + x219 + x220 + x221 + x222 + x223 + x224 + x225 + x226 + x227 + x228 + x229 + x230 + x231 + x232 + x233 + x234 + x235 + x236 + x237 + x238 + x239 + x240 + x241 + x242 + x243 + x244 + x245 + x246 + x247 + x248 + x249 + x250 + x251 + x252 + x253 + x254 + x255 + x256 + x257
    263 
    264 
    265 import dis
    266 import binascii
    267 
    268 dis.dis(f)
    269 h = f.__code__.co_code.hex()
    270 inst_code = " ".join([h[i:i + 4] for i in range(0, len(h), 4)]).split()
    271 print('')
    272 print(
    273     'Bytes in bytecode:', len(f.__code__.co_code),
    274     f'(number of instructions: {len(inst_code)})'
    275 )
    276 print('Number of elements in `co_const` tuple:', len(f.__code__.co_consts))
    277 print(
    278     'Instructions at byte offset 1016 to 1034:\n\n\t',
    279     " ".join(inst_code[1016 // 2:1032 // 2 + 1])
    280 )
    281 print(f'\n({dis.opname[0x64]:<12s}) 0x64 0xff')
    282 print(f'({dis.opname[0x7d]:<12s}) 0x7d 0xfe')
    283 print(f'({dis.opname[0x90]:<12s}) 0x90 0x01')
    284 print(f'({dis.opname[0x64]:<12s}) 0x64 0x00')
    285 print(f'({dis.opname[0x7d]:<12s}) 0x7d 0xff')
    286 print(f'({dis.opname[0x90]:<12s}) 0x90 0x01')
    287 print(f'({dis.opname[0x64]:<12s}) 0x64 0x01')
    288 print(f'({dis.opname[0x90]:<12s}) 0x90 0x01')
    289 print(f'({dis.opname[0x7d]:<12s}) 0x7d 0x00')