minor functionality enhancements

This commit is contained in:
JanLJL
2020-01-17 06:55:05 +01:00
parent 3656b222ca
commit 6d6d3b7ccb
2 changed files with 27 additions and 21 deletions

View File

@@ -277,23 +277,23 @@ class ParserAArch64v81(BaseParser):
def process_operand(self, operand):
# structure memory addresses
if self.MEMORY_ID in operand:
return self.substitute_memory_address(operand[self.MEMORY_ID])
return self.process_memory_address(operand[self.MEMORY_ID])
# structure register lists
if self.REGISTER_ID in operand and (
'list' in operand[self.REGISTER_ID] or 'range' in operand[self.REGISTER_ID]
):
# TODO: discuss if ranges should be converted to lists
return self.substitute_register_list(operand[self.REGISTER_ID])
return self.process_register_list(operand[self.REGISTER_ID])
if self.REGISTER_ID in operand and operand[self.REGISTER_ID]['name'] == 'sp':
return self.substitute_sp_register(operand[self.REGISTER_ID])
return self.process_sp_register(operand[self.REGISTER_ID])
# add value attribute to floating point immediates without exponent
if self.IMMEDIATE_ID in operand:
return self.substitute_immediate(operand[self.IMMEDIATE_ID])
return self.process_immediate(operand[self.IMMEDIATE_ID])
if self.LABEL_ID in operand:
return self.substitute_label(operand[self.LABEL_ID])
return self.process_label(operand[self.LABEL_ID])
return operand
def substitute_memory_address(self, memory_address):
def process_memory_address(self, memory_address):
# Remove unnecessarily created dictionary entries during parsing
offset = None if 'offset' not in memory_address else memory_address['offset']
base = None if 'base' not in memory_address else memory_address['base']
@@ -315,12 +315,12 @@ class ParserAArch64v81(BaseParser):
new_dict['post_indexed'] = memory_address['post_indexed']
return AttrDict({self.MEMORY_ID: new_dict})
def substitute_sp_register(self, register):
def process_sp_register(self, register):
reg = register
reg['prefix'] = 'x'
return AttrDict({self.REGISTER_ID: reg})
def substitute_register_list(self, register_list):
def process_register_list(self, register_list):
# Remove unnecessarily created dictionary entries during parsing
vlist = []
dict_name = ''
@@ -336,7 +336,7 @@ class ParserAArch64v81(BaseParser):
new_dict = AttrDict({dict_name: vlist, 'index': index})
return AttrDict({self.REGISTER_ID: new_dict})
def substitute_immediate(self, immediate):
def process_immediate(self, immediate):
dict_name = ''
if 'identifier' in immediate:
# actually an identifier, change declaration
@@ -360,7 +360,7 @@ class ParserAArch64v81(BaseParser):
{self.IMMEDIATE_ID: AttrDict({'value': immediate[dict_name]['mantissa']})}
)
def substitute_label(self, label):
def process_label(self, label):
# remove duplicated 'name' level due to identifier
label['name'] = label['name']['name']
return AttrDict({self.LABEL_ID: label})

View File

@@ -15,9 +15,8 @@ class ParserX86ATT(BaseParser):
pp.Optional(pp.Literal('-')) + pp.Word(pp.nums)
).setResultsName('value')
hex_number = pp.Combine(pp.Literal('0x') + pp.Word(pp.hexnums)).setResultsName('value')
# Comment
symbol_comment = '#'
self.comment = pp.Literal(symbol_comment) + pp.Group(
# Comment - either '#' or '//' (icc)
self.comment = (pp.Literal('#') | pp.Literal('//')) + pp.Group(
pp.ZeroOrMore(pp.Word(pp.printables))
).setResultsName(self.COMMENT_ID)
# Define x86 assembly identifier
@@ -51,7 +50,8 @@ class ParserX86ATT(BaseParser):
immediate = pp.Group(
pp.Literal(symbol_immediate) + (hex_number | decimal_number | identifier)
).setResultsName(self.IMMEDIATE_ID)
# Memory: offset(base, index, scale)
# Memory preparations
offset = pp.Group(identifier | hex_number | decimal_number).setResultsName(
self.IMMEDIATE_ID
)
@@ -76,7 +76,7 @@ class ParserX86ATT(BaseParser):
+ pp.Literal(':')
+ segment_extension.setResultsName(self.SEGMENT_EXT_ID)
)
# Memory: offset | seg:seg_ext | offset(base, index, scale){mask}
memory = pp.Group(
(
pp.Optional(pp.Suppress(pp.Literal('*')))
@@ -88,6 +88,12 @@ class ParserX86ATT(BaseParser):
+ pp.Optional(pp.Suppress(pp.Literal(',')))
+ pp.Optional(scale.setResultsName('scale'))
+ pp.Literal(')')
+ pp.Optional(
pp.Literal('{')
+ pp.Literal('%')
+ pp.Word(pp.alphanums).setResultsName('mask')
+ pp.Literal('}')
)
)
| memory_segmentation
| (hex_number | pp.Word(pp.nums)).setResultsName('offset')
@@ -249,14 +255,14 @@ class ParserX86ATT(BaseParser):
def process_operand(self, operand):
# For the moment, only used to structure memory addresses
if self.MEMORY_ID in operand:
return self.substitute_memory_address(operand[self.MEMORY_ID])
return self.process_memory_address(operand[self.MEMORY_ID])
if self.IMMEDIATE_ID in operand:
return self.substitue_immediate(operand[self.IMMEDIATE_ID])
return self.process_immediate(operand[self.IMMEDIATE_ID])
if self.LABEL_ID in operand:
return self.substitute_label(operand[self.LABEL_ID])
return self.process_label(operand[self.LABEL_ID])
return operand
def substitute_memory_address(self, memory_address):
def process_memory_address(self, memory_address):
# Remove unecessarily created dictionary entries during memory address parsing
offset = None if 'offset' not in memory_address else memory_address['offset']
base = None if 'base' not in memory_address else memory_address['base']
@@ -270,12 +276,12 @@ class ParserX86ATT(BaseParser):
new_dict[self.SEGMENT_EXT_ID] = memory_address[self.SEGMENT_EXT_ID]
return AttrDict({self.MEMORY_ID: new_dict})
def substitute_label(self, label):
def process_label(self, label):
# remove duplicated 'name' level due to identifier
label['name'] = label['name']['name']
return AttrDict({self.LABEL_ID: label})
def substitue_immediate(self, immediate):
def process_immediate(self, immediate):
if 'identifier' in immediate:
# actually an identifier, change declaration
return immediate