about summary refs log tree commit diff stats
path: root/miasm2/core/parse_asm.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/core/parse_asm.py')
-rw-r--r--miasm2/core/parse_asm.py86
1 files changed, 33 insertions, 53 deletions
diff --git a/miasm2/core/parse_asm.py b/miasm2/core/parse_asm.py
index dba097fa..09003ed9 100644
--- a/miasm2/core/parse_asm.py
+++ b/miasm2/core/parse_asm.py
@@ -1,11 +1,11 @@
 #!/usr/bin/env python
 #-*- coding:utf-8 -*-
-
 import re
+
 import miasm2.expression.expression as m2_expr
-from miasm2.core.asmbloc import *
-from miasm2.core.utils import pck
+import miasm2.core.asmbloc as asmbloc
 from miasm2.core.cpu import gen_base_expr, parse_ast
+
 declarator = {'byte': 8,
               'word': 16,
               'dword': 32,
@@ -33,12 +33,15 @@ def guess_next_new_label(symbol_pool, gen_label_index=0):
 
 def parse_txt(mnemo, attrib, txt, symbol_pool=None, gen_label_index=0):
     if symbol_pool is None:
-        symbol_pool = asm_symbol_pool()
+        symbol_pool = asmbloc.asm_symbol_pool()
 
     lines_text = []
     lines_data = []
     lines_bss = []
 
+    C_NEXT = asmbloc.asm_constraint.c_next
+    C_TO = asmbloc.asm_constraint.c_to
+
     lines = lines_text
     # parse each line
     for line in txt.split('\n'):
@@ -79,36 +82,36 @@ def parse_txt(mnemo, attrib, txt, symbol_pool=None, gen_label_index=0):
                 raw = raw.decode('string_escape')
                 if directive == 'string':
                     raw += "\x00"
-                lines.append(asm_raw(raw))
+                lines.append(asmbloc.asm_raw(raw))
                 continue
             if directive == 'ustring':
                 # XXX HACK
                 line = line.replace(r'\n', '\n').replace(r'\r', '\r')
                 raw = line[line.find(r'"') + 1:line.rfind(r"'")] + "\x00"
                 raw = raw.decode('string_escape')
-                raw = "".join(map(lambda x: x + '\x00', raw))
-                lines.append(asm_raw(raw))
+                raw = "".join([string + '\x00' for string in raw])
+                lines.append(asmbloc.asm_raw(raw))
                 continue
             if directive in declarator:
                 data_raw = line[r.end():].split(' ', 1)[1]
                 data_raw = data_raw.split(',')
                 size = declarator[directive]
                 data_int = []
-                has_symb = False
 
                 # parser
-                variable, operand, base_expr = gen_base_expr()
-                my_var_parser = parse_ast(lambda x:m2_expr.ExprId(x, size),
-                                          lambda x:m2_expr.ExprInt_fromsize(size, x))
+                base_expr = gen_base_expr()[2]
+                my_var_parser = parse_ast(lambda x: m2_expr.ExprId(x, size),
+                                          lambda x:
+                                              m2_expr.ExprInt_fromsize(size, x))
                 base_expr.setParseAction(my_var_parser)
 
                 for b in data_raw:
                     b = b.strip()
                     x = base_expr.parseString(b)[0]
                     data_int.append(x.canonize())
-                p = size2pck[size]
+
                 raw = data_int
-                x = asm_raw(raw)
+                x = asmbloc.asm_raw(raw)
                 x.element_size = size
                 lines.append(x)
                 continue
@@ -116,12 +119,12 @@ def parse_txt(mnemo, attrib, txt, symbol_pool=None, gen_label_index=0):
                 # TODO
                 continue
             if directive == 'split':  # custom command
-                x = asm_raw()
+                x = asmbloc.asm_raw()
                 x.split = True
                 lines.append(x)
                 continue
             if directive == 'dontsplit':  # custom command
-                lines.append(asm_raw(line.strip()))
+                lines.append(asmbloc.asm_raw(line.strip()))
                 continue
             if directive in ['file', 'intel_syntax', 'globl', 'local',
                              'type', 'size', 'align', 'ident', 'section']:
@@ -148,12 +151,12 @@ def parse_txt(mnemo, attrib, txt, symbol_pool=None, gen_label_index=0):
             instr.dstflow2label(symbol_pool)
         lines.append(instr)
 
-    log_asmbloc.info("___pre asm oki___")
+    asmbloc.log_asmbloc.info("___pre asm oki___")
     # make blocs
-    # gen_label_index = 0
 
     blocs_sections = []
     bloc_num = 0
+    b = None
     for lines in [lines_text, lines_data, lines_bss]:
         state = 0
         i = 0
@@ -162,81 +165,58 @@ def parse_txt(mnemo, attrib, txt, symbol_pool=None, gen_label_index=0):
         bloc_to_nlink = None
         block_may_link = False
         while i < len(lines):
-            # print 'DEAL', lines[i], state
             # no current bloc
             if state == 0:
-                if not isinstance(lines[i], asm_label):
+                if not isinstance(lines[i], asmbloc.asm_label):
                     l = guess_next_new_label(symbol_pool)
                     lines[i:i] = [l]
                 else:
                     l = lines[i]
-                    b = asm_bloc(l)
+                    b = asmbloc.asm_bloc(l)
                     b.bloc_num = bloc_num
                     bloc_num += 1
                     blocs.append(b)
                     state = 1
                     i += 1
                     if bloc_to_nlink:
-                        # print 'nlink!'
-                        bloc_to_nlink.addto(
-                            asm_constraint(b.label, asm_constraint.c_next))
+                        bloc_to_nlink.addto(asmbloc.asm_constraint(b.label,
+                                                                   C_NEXT))
                         bloc_to_nlink = None
 
             # in bloc
             elif state == 1:
-                # asm_raw
-                if isinstance(lines[i], asm_raw):
+                if isinstance(lines[i], asmbloc.asm_raw):
                     if hasattr(lines[i], 'split'):
                         state = 0
                         block_may_link = False
                         i += 1
-                    else: #if lines[i].raw.startswith('.dontsplit'):
-                        # raw asm are link by default
-                        # print 'dontsplit'
+                    else:
                         state = 1
                         block_may_link = True
                         b.addline(lines[i])
                         i += 1
-                    """
-                    else:
-                        b.addline(lines[i])
-                        i += 1
-                    """
-                # asm_label
-                elif isinstance(lines[i], asm_label):
+                # asmbloc.asm_label
+                elif isinstance(lines[i], asmbloc.asm_label):
                     if block_may_link:
-                        # print 'nlink!'
                         b.addto(
-                            asm_constraint(lines[i], asm_constraint.c_next))
+                            asmbloc.asm_constraint(lines[i], C_NEXT))
                         block_may_link = False
                     state = 0
                 # instruction
                 else:
                     b.addline(lines[i])
                     if lines[i].dstflow():
-                        '''
-                        mydst = lines[i].args
-                        if len(mydst)==1 and mnemo.get_symbols(mydst[0]):
-                            arg = dict(mydst[0])
-                            symbs = mnemo.get_symbols(arg)
-                            """
-                            TODO XXX redo this (as many miasm parts)
-                            """
-                            l = symbs[0][0]
-                            lines[i].setdstflow([l])
-                            b.addto(asm_constraint(l, asm_constraint.c_to))
-                        '''
                         for x in lines[i].getdstflow(symbol_pool):
                             if not isinstance(x, m2_expr.ExprId):
                                 continue
                             if x in mnemo.regs.all_regs_ids:
                                 continue
-                            b.addto(asm_constraint(x, asm_constraint.c_to))
+                            b.addto(asmbloc.asm_constraint(x, C_TO))
 
                         # TODO XXX redo this really
 
                         if not lines[i].breakflow() and i + 1 < len(lines):
-                            if isinstance(lines[i + 1], asm_label):
+                            if isinstance(lines[i + 1], asmbloc.asm_label):
                                 l = lines[i + 1]
                             else:
                                 l = guess_next_new_label(symbol_pool)
@@ -253,7 +233,7 @@ def parse_txt(mnemo, attrib, txt, symbol_pool=None, gen_label_index=0):
 
                     i += 1
 
-    for b in blocs_sections[0]:
-        log_asmbloc.info(b)
+    for block in blocs_sections[0]:
+        asmbloc.log_asmbloc.info(block)
 
     return blocs_sections, symbol_pool