| #!/usr/bin/env python |
| |
| import sys |
| import re |
| |
| hexrule = re.compile("([0-9a-fA-F]+)") |
| hex2byterule = re.compile("([0-9a-fA-F]{4})") |
| hexcolonrule = re.compile("([0-9a-fA-F]+)\:") |
| symbolrule = re.compile("<([\._a-zA-Z]+[\._0-9a-zA-Z]*)>:") |
| insrule = re.compile("([a-zA-Z][\.a-zA-Z]*)") |
| |
| currsymbol = "" |
| curraddress = 0 |
| count = 0 |
| |
| for line in sys.stdin: |
| t = line.split() |
| |
| if len(t) == 0: |
| continue |
| |
| try: |
| |
| # match the address |
| match = hexcolonrule.match(t[0]) |
| if match: |
| #print("%s %s" % (match, match.group(1))) |
| curraddress = int(match.group(1), 16) |
| #print("curraddress 0x%x" % curraddress) |
| |
| # see if this is a symbol declaration |
| match = symbolrule.match(t[1]) |
| if match: |
| # print(the previous count) |
| if count > 0: |
| print("%d %s" % (count, currsymbol)) |
| count = 0 |
| |
| #print("%s %s" % (match, match.group(1))) |
| currsymbol = str(match.group(1)) |
| #print("current symbol is now '%s'" % currsymbol) |
| continue |
| |
| # see if it's a one or two byte opcode |
| iindex = 2 |
| match = hex2byterule.match(t[1]) |
| if not match: |
| continue |
| match = hex2byterule.match(t[2]) |
| if match: |
| #print("match %s, %s" % (match, match.group(0))) |
| iindex = 3 |
| |
| #print("instruction starts at index %d: '%s'" % (iindex, t[iindex])) |
| |
| # match the instruction string |
| insmatch = insrule.match(t[iindex]) |
| if not insmatch: |
| continue |
| ins = insmatch.group(1) |
| #print("instruction '%s'" % ins) |
| |
| # look for a few special instructions |
| if ins == "push": |
| c = (len(t) - 1 - iindex) * 4 |
| #print("%d bytes pushed" % c) |
| count += c |
| |
| # look for a few special instructions |
| if ins == "stmdb": |
| c = (len(t) - 2 - iindex) * 4 |
| #print("%d bytes stmed" % c) |
| count += c |
| |
| if ins == "sub": |
| reg = t[iindex+1] |
| if reg == "sp,": |
| conststr = t[iindex+2] |
| c = int(conststr[1:]) |
| #print("subtracting from sp, val %d" % c) |
| count += c |
| |
| except IndexError: |
| continue |
| except Exception as e: |
| print("Exception %s" % e) |
| continue |
| |
| # print(the last count) |
| if count > 0: |
| print("%d %s" % (count, currsymbol)) |
| |