1#!/usr/bin/env python
2
3import sys
4import re
5
6hexrule = re.compile("([0-9a-fA-F]+)")
7hex2byterule = re.compile("([0-9a-fA-F]{4})")
8hexcolonrule = re.compile("([0-9a-fA-F]+)\:")
9symbolrule = re.compile("<([\._a-zA-Z]+[\._0-9a-zA-Z]*)>:")
10insrule = re.compile("([a-zA-Z][\.a-zA-Z]*)")
11
12currsymbol = ""
13curraddress = 0
14count = 0
15
16for line in sys.stdin:
17    t = line.split()
18
19    if len(t) == 0:
20        continue
21
22    try:
23
24        # match the address
25        match = hexcolonrule.match(t[0])
26        if match:
27            #print("%s %s" % (match, match.group(1)))
28            curraddress = int(match.group(1), 16)
29            #print("curraddress 0x%x" % curraddress)
30
31        # see if this is a symbol declaration
32        match = symbolrule.match(t[1])
33        if match:
34            # print(the previous count)
35            if count > 0:
36                print("%d %s" % (count, currsymbol))
37            count = 0
38
39            #print("%s %s" % (match, match.group(1)))
40            currsymbol = str(match.group(1))
41            #print("current symbol is now '%s'" % currsymbol)
42            continue
43
44        # see if it's a one or two byte opcode
45        iindex = 2
46        match = hex2byterule.match(t[1])
47        if not match:
48            continue
49        match = hex2byterule.match(t[2])
50        if match:
51            #print("match %s, %s" % (match, match.group(0)))
52            iindex = 3
53
54        #print("instruction starts at index %d: '%s'" % (iindex, t[iindex]))
55
56        # match the instruction string
57        insmatch = insrule.match(t[iindex])
58        if not insmatch:
59            continue
60        ins = insmatch.group(1)
61        #print("instruction '%s'" % ins)
62
63        # look for a few special instructions
64        if ins == "push":
65            c = (len(t) - 1 - iindex) * 4
66            #print("%d bytes pushed" % c)
67            count += c
68
69        # look for a few special instructions
70        if ins == "stmdb":
71            c = (len(t) - 2 - iindex) * 4
72            #print("%d bytes stmed" % c)
73            count += c
74
75        if ins == "sub":
76            reg = t[iindex+1]
77            if reg == "sp,":
78                conststr = t[iindex+2]
79                c = int(conststr[1:])
80                #print("subtracting from sp, val %d" % c)
81                count += c
82
83    except IndexError:
84        continue
85    except Exception as e:
86        print("Exception %s" % e)
87        continue
88
89# print(the last count)
90if count > 0:
91    print("%d %s" % (count, currsymbol))
92
93