about summary refs log tree commit diff stats
path: root/miasm2/arch/x86/arch.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/arch/x86/arch.py')
-rw-r--r--miasm2/arch/x86/arch.py259
1 files changed, 133 insertions, 126 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py
index b625647e..7a2c371c 100644
--- a/miasm2/arch/x86/arch.py
+++ b/miasm2/arch/x86/arch.py
@@ -1,6 +1,12 @@
 #-*- coding:utf-8 -*-
 
+from __future__ import print_function
+from builtins import range
 import re
+
+from future.utils import viewitems
+
+from miasm2.core.utils import int_to_byte
 from miasm2.expression.expression import *
 from pyparsing import *
 from miasm2.core.cpu import *
@@ -123,7 +129,7 @@ replace_regs = {16: replace_regs16,
 
 
 segm2enc = {CS: 1, SS: 2, DS: 3, ES: 4, FS: 5, GS: 6}
-enc2segm = dict([(x[1], x[0]) for x in segm2enc.items()])
+enc2segm = dict((value, key) for key, value in viewitems(segm2enc))
 
 segm_info = reg_info_dct(enc2segm)
 
@@ -215,7 +221,7 @@ XMMWORD = Literal('XMMWORD')
 MEMPREFIX2SIZE = {'BYTE': 8, 'WORD': 16, 'DWORD': 32,
                   'QWORD': 64, 'TBYTE': 80, 'XMMWORD': 128}
 
-SIZE2MEMPREFIX = dict((x[1], x[0]) for x in MEMPREFIX2SIZE.items())
+SIZE2MEMPREFIX = dict((value, key) for key, value in viewitems(MEMPREFIX2SIZE))
 
 def cb_deref_mem(tokens):
     if len(tokens) == 2:
@@ -272,7 +278,7 @@ class x86_arg(m_arg):
             if value.name in ["FAR"]:
                 return None
 
-            loc_key = loc_db.get_or_create_name_location(value.name)
+            loc_key = loc_db.get_or_create_name_location(value.name.encode())
             return ExprLoc(loc_key, size_hint)
         if isinstance(value, AstOp):
             # First pass to retrieve fixed_size
@@ -430,13 +436,13 @@ repeat_mn = ["INS", "OUTS",
              ]
 
 
-class group:
+class group(object):
 
     def __init__(self):
         self.value = None
 
 
-class additional_info:
+class additional_info(object):
 
     def __init__(self):
         self.except_on_instr = False
@@ -446,7 +452,7 @@ class additional_info:
         self.stk = False
         self.v_opmode = None
         self.v_admode = None
-        self.prefixed = ''
+        self.prefixed = b''
 
 
 class instruction_x86(instruction):
@@ -537,7 +543,7 @@ class instruction_x86(instruction):
         self.additional_info.v_opmode = c.v_opmode()
         self.additional_info.v_admode = c.v_admode()
         self.additional_info.prefix = c.prefix
-        self.additional_info.prefixed = getattr(c, "prefixed", "")
+        self.additional_info.prefixed = getattr(c, "prefixed", b"")
 
     def __str__(self):
         return self.to_string()
@@ -547,13 +553,13 @@ class instruction_x86(instruction):
         if self.additional_info.g1.value & 1:
             o = "LOCK %s" % o
         if self.additional_info.g1.value & 2:
-            if getattr(self.additional_info.prefixed, 'default', "") != "\xF2":
+            if getattr(self.additional_info.prefixed, 'default', b"") != b"\xF2":
                 o = "REPNE %s" % o
         if self.additional_info.g1.value & 8:
-            if getattr(self.additional_info.prefixed, 'default', "") != "\xF3":
+            if getattr(self.additional_info.prefixed, 'default', b"") != b"\xF3":
                 o = "REP %s" % o
         elif self.additional_info.g1.value & 4:
-            if getattr(self.additional_info.prefixed, 'default', "") != "\xF3":
+            if getattr(self.additional_info.prefixed, 'default', b"") != b"\xF3":
                 o = "REPE %s" % o
         return o
 
@@ -650,7 +656,7 @@ class mn_x86(cls_mn):
         info.g2.value = self.g2.value
         info.stk = hasattr(self, 'stk')
         info.v_opmode = self.v_opmode()
-        info.prefixed = ""
+        info.prefixed = b""
         if hasattr(self, 'prefixed'):
             info.prefixed = self.prefixed.default
         return info
@@ -705,40 +711,40 @@ class mn_x86(cls_mn):
                         'rex_r': 0,
                         'rex_x': 0,
                         'rex_b': 0,
-                        'prefix': "",
-                        'prefixed': "",
+                        'prefix': b"",
+                        'prefixed': b"",
                         }
         while True:
             c = v.getbytes(offset)
-            if c == '\x66':
+            if c == b'\x66':
                 pre_dis_info['opmode'] = 1
-            elif c == '\x67':
+            elif c == b'\x67':
                 pre_dis_info['admode'] = 1
-            elif c == '\xf0':
+            elif c == b'\xf0':
                 pre_dis_info['g1'] = 1
-            elif c == '\xf2':
+            elif c == b'\xf2':
                 pre_dis_info['g1'] = 2
-            elif c == '\xf3':
+            elif c == b'\xf3':
                 pre_dis_info['g1'] = 12
 
-            elif c == '\x2e':
+            elif c == b'\x2e':
                 pre_dis_info['g2'] = 1
-            elif c == '\x36':
+            elif c == b'\x36':
                 pre_dis_info['g2'] = 2
-            elif c == '\x3e':
+            elif c == b'\x3e':
                 pre_dis_info['g2'] = 3
-            elif c == '\x26':
+            elif c == b'\x26':
                 pre_dis_info['g2'] = 4
-            elif c == '\x64':
+            elif c == b'\x64':
                 pre_dis_info['g2'] = 5
-            elif c == '\x65':
+            elif c == b'\x65':
                 pre_dis_info['g2'] = 6
 
             else:
                 break
             pre_dis_info['prefix'] += c
             offset += 1
-        if mode == 64 and c in '@ABCDEFGHIJKLMNO':
+        if mode == 64 and c in b'@ABCDEFGHIJKLMNO':
             x = ord(c)
             pre_dis_info['rex_p'] = 1
             pre_dis_info['rex_w'] = (x >> 3) & 1
@@ -746,7 +752,7 @@ class mn_x86(cls_mn):
             pre_dis_info['rex_x'] = (x >> 1) & 1
             pre_dis_info['rex_b'] = (x >> 0) & 1
             offset += 1
-        elif pre_dis_info.get('g1', None) == 12 and c in ['\xa6', '\xa7', '\xae', '\xaf']:
+        elif pre_dis_info.get('g1', None) == 12 and c in [b'\xa6', b'\xa7', b'\xae', b'\xaf']:
             pre_dis_info['g1'] = 4
         return pre_dis_info, v, mode, offset, offset - offset_o
 
@@ -793,14 +799,14 @@ class mn_x86(cls_mn):
     def add_pre_dis_info(self, pre_dis_info=None):
         if pre_dis_info is None:
             return True
-        if hasattr(self, "prefixed") and self.prefixed.default == "\x66":
+        if hasattr(self, "prefixed") and self.prefixed.default == b"\x66":
             pre_dis_info['opmode'] = 0
         self.opmode = pre_dis_info['opmode']
         self.admode = pre_dis_info['admode']
 
         if hasattr(self, 'no_xmm_pref') and\
                 pre_dis_info['prefix'] and\
-                pre_dis_info['prefix'][-1] in '\x66\xf2\xf3':
+                pre_dis_info['prefix'][-1] in b'\x66\xf2\xf3':
             return False
         if (hasattr(self, "prefixed") and
             not pre_dis_info['prefix'].endswith(self.prefixed.default)):
@@ -831,7 +837,7 @@ class mn_x86(cls_mn):
 
 
     def gen_prefix(self):
-        v = ""
+        v = b""
         rex = 0x40
         if self.g1.value is None:
             self.g1.value = 0
@@ -847,36 +853,40 @@ class mn_x86(cls_mn):
         if self.rex_b.value:
             rex |= 0x1
         if rex != 0x40 or self.rex_p.value == 1:
-            v = chr(rex) + v
+            v = int_to_byte(rex) + v
             if hasattr(self, 'no_rex'):
                 return None
 
-
-
         if hasattr(self, 'prefixed'):
             v = self.prefixed.default + v
 
         if self.g1.value & 1:
-            v = "\xf0" + v
+            v = b"\xf0" + v
         if self.g1.value & 2:
             if hasattr(self, 'no_xmm_pref'):
                 return None
-            v = "\xf2" + v
+            v = b"\xf2" + v
         if self.g1.value & 12:
             if hasattr(self, 'no_xmm_pref'):
                 return None
-            v = "\xf3" + v
+            v = b"\xf3" + v
         if self.g2.value:
-            v = {1: '\x2e', 2: '\x36', 3: '\x3e', 4:
-                 '\x26', 5: '\x64', 6: '\x65'}[self.g2.value] + v
+            v = {
+                1: b'\x2e',
+                2: b'\x36',
+                3: b'\x3e',
+                4: b'\x26',
+                5: b'\x64',
+                6: b'\x65'
+            }[self.g2.value] + v
         # mode prefix
         if hasattr(self, "admode") and self.admode:
-            v = "\x67" + v
+            v = b"\x67" + v
 
         if hasattr(self, "opmode") and self.opmode:
             if hasattr(self, 'no_xmm_pref'):
                 return None
-            v = "\x66" + v
+            v = b"\x66" + v
         return v
 
     def encodefields(self, decoded):
@@ -1436,25 +1446,25 @@ def gen_modrm_form():
     sib_u32 = [{f_isad: True} for i in range(0x100)]
 
     sib_u64 = []
-    for rex_x in xrange(2):
+    for rex_x in range(2):
         o = []
-        for rex_b in xrange(2):
+        for rex_b in range(2):
             x = [{f_isad: True} for i in range(0x100)]
             o.append(x)
         sib_u64.append(o)
 
     sib_u64_ebp = []
-    for rex_x in xrange(2):
+    for rex_x in range(2):
         o = []
-        for rex_b in xrange(2):
+        for rex_b in range(2):
             x = [{f_isad: True} for i in range(0x100)]
             o.append(x)
         sib_u64_ebp.append(o)
 
     sib_64_s08_ebp = []
-    for rex_x in xrange(2):
+    for rex_x in range(2):
         o = []
-        for rex_b in xrange(2):
+        for rex_b in range(2):
             x = [{f_isad: True} for i in range(0x100)]
             o.append(x)
         sib_64_s08_ebp.append(o)
@@ -1479,17 +1489,17 @@ def gen_modrm_form():
                 elif sib_rez == sib_u32:
                     sib_rez[index][f_imm] = f_u32
                 elif sib_rez == sib_u64_ebp:
-                    for rex_b in xrange(2):
-                        for rex_x in xrange(2):
+                    for rex_b in range(2):
+                        for rex_x in range(2):
                             sib_rez[rex_x][rex_b][index][f_imm] = f_u32
                             sib_rez[rex_x][rex_b][index][ebp + 8 * rex_b] = 1
                 elif sib_rez == sib_u64:
-                    for rex_b in xrange(2):
-                        for rex_x in xrange(2):
+                    for rex_b in range(2):
+                        for rex_x in range(2):
                             sib_rez[rex_x][rex_b][index][f_imm] = f_u32
                 elif sib_rez == sib_64_s08_ebp:
-                    for rex_b in xrange(2):
-                        for rex_x in xrange(2):
+                    for rex_b in range(2):
+                        for rex_x in range(2):
                             sib_rez[rex_x][rex_b][index][f_imm] = f_s08
                             sib_rez[rex_x][rex_b][index][ebp + 8 * rex_b] = 1
 
@@ -1503,17 +1513,17 @@ def gen_modrm_form():
                 elif sib_rez == sib_u32:
                     sib_rez[index][b] = 1
                 elif sib_rez == sib_u64_ebp:
-                    for rex_b in xrange(2):
-                        for rex_x in xrange(2):
+                    for rex_b in range(2):
+                        for rex_x in range(2):
                             sib_rez[rex_x][rex_b][index][b + 8 * rex_b] = 1
                             sib_rez[rex_x][rex_b][index][f_imm] = f_u32
                 elif sib_rez == sib_u64:
-                    for rex_b in xrange(2):
-                        for rex_x in xrange(2):
+                    for rex_b in range(2):
+                        for rex_x in range(2):
                             sib_rez[rex_x][rex_b][index][b + 8 * rex_b] = 1
                 elif sib_rez == sib_64_s08_ebp:
-                    for rex_b in xrange(2):
-                        for rex_x in xrange(2):
+                    for rex_b in range(2):
+                        for rex_x in range(2):
                             sib_rez[rex_x][rex_b][index][f_imm] = f_s08
                             sib_rez[rex_x][rex_b][index][b + 8 * rex_b] = 1
 
@@ -1526,8 +1536,8 @@ def gen_modrm_form():
                     sib_rez[index][tmp] = 0  # 1 << ss
                 sib_rez[index][tmp] += 1 << ss
             else:
-                for rex_b in xrange(2):
-                    for rex_x in xrange(2):
+                for rex_b in range(2):
+                    for rex_x in range(2):
                         tmp = i + 8 * rex_x
                         if i == 0b100 and rex_x == 0:
                             continue
@@ -1649,18 +1659,16 @@ def gen_modrm_form():
                   32: defaultdict(list),
                   64: defaultdict(list),
                   }
-    for size, db_afs in byte2modrm.items():
+    for size, db_afs in viewitems(byte2modrm):
         for i, modrm in enumerate(db_afs):
             if not isinstance(modrm, list):
-                modrm = modrm.items()
-                modrm.sort()
-                modrm = tuple(modrm)
+                # We only need sort for determinism
+                modrm = tuple(sorted(viewitems(modrm), key=str))
                 modrm2byte[size][modrm].append(i)
                 continue
             for j, modrm_f in enumerate(modrm):
-                modrm_f = modrm_f.items()
-                modrm_f.sort()
-                modrm_f = tuple(modrm_f)
+                # We only need sort for determinism
+                modrm_f = tuple(sorted(viewitems(modrm_f), key=str))
                 modrm2byte[size][modrm_f].append((i, j))
 
     return byte2modrm, modrm2byte
@@ -1870,7 +1878,7 @@ def expr2modrm(expr, parent, w8, sx=0, xmm=0, mm=0, bnd=0):
 def modrm2expr(modrm, parent, w8, sx=0, xmm=0, mm=0, bnd=0):
     o = []
     if not modrm[f_isad]:
-        modrm_k = [x[0] for x in modrm.iteritems() if x[1] == 1]
+        modrm_k = [key for key, value in viewitems(modrm) if value == 1]
         if len(modrm_k) != 1:
             raise ValueError('strange reg encoding %r' % modrm)
         modrm_k = modrm_k[0]
@@ -1895,8 +1903,8 @@ def modrm2expr(modrm, parent, w8, sx=0, xmm=0, mm=0, bnd=0):
         return expr
     admode = parent.v_admode()
     opmode = parent.v_opmode()
-    for modrm_k, scale in modrm.items():
-        if isinstance(modrm_k, (int, long)):
+    for modrm_k, scale in viewitems(modrm):
+        if isinstance(modrm_k, int):
             expr = size2gpregs[admode].expr[modrm_k]
             if scale != 1:
                 expr = ExprInt(scale, admode) * expr
@@ -1965,9 +1973,9 @@ class x86_rm_arg(x86_arg):
     def gen_cand(self, v_cand, admode):
         if not admode in modrm2byte:
             # XXX TODO: 64bit
-            raise StopIteration
+            return
         if not v_cand:
-            raise StopIteration
+            return
 
         p = self.parent
         o_rex_x = p.rex_x.value
@@ -1995,9 +2003,8 @@ class x86_rm_arg(x86_arg):
 
                 v[f_imm] = size
             vo = v
-            v = v.items()
-            v.sort()
-            v = tuple(v)
+            # We only need sort for determinism
+            v = tuple(sorted(viewitems(v), key=str))
             admode = 64 if p.mode == 64 else admode
             if not v in modrm2byte[admode]:
                 continue
@@ -2047,11 +2054,11 @@ class x86_rm_arg(x86_arg):
 
                 yield True
 
-        raise StopIteration
+        return
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         admode = p.v_admode()
         mode = self.expr.size
@@ -2091,11 +2098,11 @@ class x86_rm_mem_far(x86_rm_arg):
     def encode(self):
         if not (isinstance(self.expr, m2_expr.ExprOp) and
                 self.expr.op == 'far'):
-            raise StopIteration
+            return
 
         expr = self.expr.args[0]
         if isinstance(expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         admode = p.v_admode()
         mode = expr.size
@@ -2115,7 +2122,7 @@ class x86_rm_w8(x86_rm_arg):
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         if p.w8.value is None:
             if self.expr.size == 8:
@@ -2140,7 +2147,7 @@ class x86_rm_sx(x86_rm_arg):
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         if p.w8.value is None:
             if self.expr.size == 8:
@@ -2164,7 +2171,7 @@ class x86_rm_sxd(x86_rm_arg):
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         v_cand, segm, ok = expr2modrm(self.expr, p, 1, 2)
         if segm:
@@ -2195,10 +2202,10 @@ class x86_rm_sd(x86_rm_arg):
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         if not self.expr.size in [32, 64]:
-            raise StopIteration
+            return
         self.set_s_value(0)
         v_cand, segm, ok = expr2modrm(self.expr, p, 1)
         for x in self.gen_cand(v_cand, p.v_admode()):
@@ -2214,7 +2221,7 @@ class x86_rm_wd(x86_rm_sd):
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         p.wd.value = 0
         v_cand, segm, ok = expr2modrm(self.expr, p, 1)
@@ -2237,7 +2244,7 @@ class x86_rm_08(x86_rm_arg):
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         v_cand, segm, ok = expr2modrm(self.expr, p, 0, 0, 0, 0)
         for x in self.gen_cand(v_cand, p.v_admode()):
@@ -2257,7 +2264,7 @@ class x86_rm_reg_m08(x86_rm_arg):
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         if isinstance(self.expr, ExprMem):
             expr = ExprMem(self.expr.ptr, 32)
@@ -2284,7 +2291,7 @@ class x86_rm_m64(x86_rm_arg):
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         p = self.parent
         v_cand, segm, ok = expr2modrm(self.expr, p, 0, 0, 0, 1)
         for x in self.gen_cand(v_cand, p.v_admode()):
@@ -2296,9 +2303,9 @@ class x86_rm_m80(x86_rm_m64):
 
     def encode(self):
         if isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         if not isinstance(self.expr, ExprMem) or self.expr.size != self.msize:
-            raise StopIteration
+            return
         p = self.parent
         mode = p.mode
         if mode == 64:
@@ -2320,7 +2327,7 @@ class x86_rm_m08(x86_rm_arg):
 
     def encode(self):
         if self.expr.size != 8:
-            raise StopIteration
+            return
         p = self.parent
         mode = p.mode
         v_cand, segm, ok = expr2modrm(self.expr, p, 0)
@@ -2354,9 +2361,9 @@ class x86_rm_mm(x86_rm_m80):
     def encode(self):
         expr = self.expr
         if isinstance(expr, ExprInt):
-            raise StopIteration
+            return
         if isinstance(expr, ExprMem) and expr.size != self.msize:
-            raise StopIteration
+            return
         p = self.parent
         mode = p.mode
         if mode == 64:
@@ -2458,7 +2465,7 @@ class x86_rm_reg_noarg(object):
                 self.parent.w8.value = 0
             return start, stop
         try:
-            result, start, stop = self.parser.scanString(text).next()
+            result, start, stop = next(self.parser.scanString(text))
         except StopIteration:
             return None, None
         expr = self.asm_ast_to_expr(result[0], loc_db)
@@ -2753,7 +2760,7 @@ class bs_cond_imm(bs_cond_scale, x86_arg):
             expr, start, stop = parser_result[self.parser]
         else:
             try:
-                expr, start, stop = self.parser.scanString(text).next()
+                expr, start, stop = next(self.parser.scanString(text))
             except StopIteration:
                 expr = None
         self.expr = expr
@@ -2788,7 +2795,7 @@ class bs_cond_imm(bs_cond_scale, x86_arg):
 
     def encode(self):
         if not isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         arg0_expr = self.parent.args[0].expr
         self.parent.rex_w.value = 0
         # special case for push
@@ -2800,10 +2807,10 @@ class bs_cond_imm(bs_cond_scale, x86_arg):
             self.l = l
             mask = ((1 << self.l) - 1)
             if v != sign_ext(v & mask, self.l, l):
-                raise StopIteration
+                return
             self.value = swap_uint(self.l, v & ((1 << self.l) - 1))
             yield True
-            raise StopIteration
+            return
 
         # assume 2 args; use first arg to guess op size
         if arg0_expr.size == 64:
@@ -2813,7 +2820,7 @@ class bs_cond_imm(bs_cond_scale, x86_arg):
         v = int(self.expr)
         if arg0_expr.size == 8:
             if not hasattr(self.parent, 'w8'):
-                raise StopIteration
+                return
             self.parent.w8.value = 0
             l = 8
             if hasattr(self.parent, 'se'):
@@ -2838,7 +2845,7 @@ class bs_cond_imm(bs_cond_scale, x86_arg):
 
         mask = ((1 << self.l) - 1)
         if v != sign_ext(v & mask, self.l, l):
-            raise StopIteration
+            return
         self.value = swap_uint(self.l, v & ((1 << self.l) - 1))
         yield True
 
@@ -2880,7 +2887,7 @@ class bs_rel_off(bs_cond_imm):
             expr, start, stop = parser_result[self.parser]
         else:
             try:
-                expr, start, stop = self.parser.scanString(text).next()
+                expr, start, stop = next(self.parser.scanString(text))
             except StopIteration:
                 expr = None
         self.expr = expr
@@ -2901,7 +2908,7 @@ class bs_rel_off(bs_cond_imm):
 
     def encode(self):
         if not isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         arg0_expr = self.parent.args[0].expr
         if self.l == 0:
             l = self.parent.v_opmode()
@@ -2911,14 +2918,14 @@ class bs_rel_off(bs_cond_imm):
         parent_len = len(prefix) * 8 + self.parent.l + self.l
         assert(parent_len % 8 == 0)
 
-        v = int(self.expr.arg - parent_len/8)
+        v = int(self.expr.arg) - parent_len // 8
         if prefix is None:
-            raise StopIteration
+            return
         mask = ((1 << self.l) - 1)
         if self.l > l:
-            raise StopIteration
+            return
         if v != sign_ext(v & mask, self.l, l):
-            raise StopIteration
+            return
         self.value = swap_uint(self.l, v & ((1 << self.l) - 1))
         yield True
 
@@ -2939,7 +2946,7 @@ class bs_s08(bs_rel_off):
 
     def encode(self):
         if not isinstance(self.expr, ExprInt):
-            raise StopIteration
+            return
         arg0_expr = self.parent.args[0].expr
         if self.l != 0:
             l = self.l
@@ -2950,9 +2957,9 @@ class bs_s08(bs_rel_off):
         v = int(self.expr)
         mask = ((1 << self.l) - 1)
         if self.l > l:
-            raise StopIteration
+            return
         if v != sign_ext(v & mask, self.l, l):
-            raise StopIteration
+            return
         self.value = swap_uint(self.l, v & ((1 << self.l) - 1))
         yield True
 
@@ -2983,12 +2990,12 @@ class bs_moff(bsi):
 
     def encode(self):
         if not hasattr(self.parent, "mseg"):
-            raise StopIteration
+            return
         m = self.parent.mseg.expr
         if not (isinstance(m, ExprOp) and m.op == 'segm'):
-            raise StopIteration
+            return
         if not isinstance(m.args[1], ExprInt):
-            raise StopIteration
+            return
         l = self.parent.v_opmode()
         if l == 16:
             self.l = 16
@@ -2997,7 +3004,7 @@ class bs_moff(bsi):
         v = int(m.args[1])
         mask = ((1 << self.l) - 1)
         if v != sign_ext(v & mask, self.l, l):
-            raise StopIteration
+            return
         self.value = swap_uint(self.l, v & ((1 << self.l) - 1))
         yield True
 
@@ -3027,7 +3034,7 @@ class bs_movoff(x86_arg):
                 return None, None
             return start, stop
         try:
-            v, start, stop = self.parser.scanString(text).next()
+            v, start, stop = next(self.parser.scanString(text))
         except StopIteration:
             return None, None
         if not isinstance(e, ExprMem):
@@ -3051,12 +3058,12 @@ class bs_movoff(x86_arg):
     def encode(self):
         p = self.parent
         if not isinstance(self.expr, ExprMem) or not isinstance(self.expr.ptr, ExprInt):
-            raise StopIteration
+            return
         self.l = p.v_admode()
         v = int(self.expr.ptr)
         mask = ((1 << self.l) - 1)
         if v != mask & v:
-            raise StopIteration
+            return
         self.value = swap_uint(self.l, v & ((1 << self.l) - 1))
         yield True
 
@@ -3092,7 +3099,7 @@ class bs_msegoff(x86_arg):
                 return None, None
             return start, stop
         try:
-            v, start, stop = self.parser.scanString(text).next()
+            v, start, stop = next(self.parser.scanString(text))
         except StopIteration:
             return None, None
         self.expr = v[0]
@@ -3103,16 +3110,16 @@ class bs_msegoff(x86_arg):
 
     def encode(self):
         if not (isinstance(self.expr, ExprOp) and self.expr.op == 'segm'):
-            raise StopIteration
+            return
         if not isinstance(self.expr.args[0], ExprInt):
-            raise StopIteration
+            return
         if not isinstance(self.expr.args[1], ExprInt):
-            raise StopIteration
+            return
         l = self.parent.v_opmode()
         v = int(self.expr.args[0])
         mask = ((1 << self.l) - 1)
         if v != sign_ext(v & mask, self.l, l):
-            raise StopIteration
+            return
         self.value = swap_uint(self.l, v & ((1 << self.l) - 1))
         yield True
 
@@ -3148,9 +3155,9 @@ sxd = bs(l=0, fname="sx")
 xmmreg = bs(l=0, fname="xmmreg")
 mmreg = bs(l=0, fname="mmreg")
 
-pref_f2 = bs(l=0, fname="prefixed", default="\xf2")
-pref_f3 = bs(l=0, fname="prefixed", default="\xf3")
-pref_66 = bs(l=0, fname="prefixed", default="\x66")
+pref_f2 = bs(l=0, fname="prefixed", default=b"\xf2")
+pref_f3 = bs(l=0, fname="prefixed", default=b"\xf3")
+pref_66 = bs(l=0, fname="prefixed", default=b"\x66")
 no_xmm_pref = bs(l=0, fname="no_xmm_pref")
 
 no_rex = bs(l=0, fname="no_rex")
@@ -3186,7 +3193,7 @@ wd = bs(l=1, fname="wd")
 stk = bs(l=0, fname="stk")
 
 
-class field_size:
+class field_size(object):
     prio = default_prio
 
     def __init__(self, d=None):
@@ -3287,7 +3294,7 @@ rm_arg_bnd_m128 = bs(l=0, cls=(x86_rm_bnd_m128,), fname='rmarg')
 rm_arg_bnd_reg = bs(l=0, cls=(x86_rm_bnd_reg,), fname='rmarg')
 
 
-swapargs = bs_swapargs(l=1, fname="swap", mn_mod=range(1 << 1))
+swapargs = bs_swapargs(l=1, fname="swap", mn_mod=list(range(1 << 1)))
 
 
 class bs_op_mode(bsi):
@@ -4626,5 +4633,5 @@ mod reg r/m
 
 
 def print_size(e):
-    print e, e.size
+    print(e, e.size)
     return e