mirror of
https://github.com/RRZE-HPC/OSACA.git
synced 2025-12-16 09:00:05 +01:00
take +- operator of offset/index in mem-addr into account
This commit is contained in:
@@ -321,9 +321,7 @@ class ParserX86Intel(ParserX86):
|
||||
|
||||
base = base_register.setResultsName("base")
|
||||
displacement = pp.Group(
|
||||
pp.Group(
|
||||
integer_number ^ identifier
|
||||
).setResultsName(self.immediate_id)
|
||||
pp.Group(integer_number ^ identifier).setResultsName(self.immediate_id)
|
||||
).setResultsName("displacement")
|
||||
short_indexed = index_register.setResultsName("index")
|
||||
long_indexed = (
|
||||
@@ -331,11 +329,10 @@ class ParserX86Intel(ParserX86):
|
||||
+ pp.Literal("*")
|
||||
+ scale.setResultsName("scale")
|
||||
)
|
||||
indexed = pp.Group(
|
||||
short_indexed
|
||||
^ long_indexed
|
||||
).setResultsName("indexed")
|
||||
indexed = pp.Group(short_indexed ^ long_indexed).setResultsName("indexed")
|
||||
operator = pp.Word("+-", exact=1)
|
||||
operator_index = pp.Word("+-", exact=1).setResultsName("operator_idx")
|
||||
operator_displacement = pp.Word("+-", exact=1).setResultsName("operator_disp")
|
||||
|
||||
# Syntax:
|
||||
# `base` always preceedes `indexed`.
|
||||
@@ -347,16 +344,24 @@ class ParserX86Intel(ParserX86):
|
||||
pp.Literal("[")
|
||||
+ (
|
||||
base
|
||||
^ (base + operator + displacement)
|
||||
^ (base + operator + displacement + operator + indexed)
|
||||
^ (base + operator + indexed)
|
||||
^ (base + operator + indexed + operator + displacement)
|
||||
^ (base + operator_displacement + displacement)
|
||||
^ (base + operator_displacement + displacement + operator_index + indexed)
|
||||
^ (base + operator_index + indexed)
|
||||
^ (base + operator_index + indexed + operator_displacement + displacement)
|
||||
^ (displacement + operator + base)
|
||||
^ (displacement + operator + base + operator + indexed)
|
||||
^ (displacement + operator + pp.Group(long_indexed).setResultsName("indexed"))
|
||||
^ (displacement + operator + base + operator_index + indexed)
|
||||
^ (
|
||||
displacement
|
||||
+ operator_index
|
||||
+ pp.Group(long_indexed).setResultsName("indexed")
|
||||
)
|
||||
^ pp.Group(long_indexed).setResultsName("indexed")
|
||||
^ (pp.Group(long_indexed).setResultsName("indexed") + operator + displacement)
|
||||
)
|
||||
^ (
|
||||
pp.Group(long_indexed).setResultsName("indexed")
|
||||
+ operator_displacement
|
||||
+ displacement
|
||||
)
|
||||
)
|
||||
+ pp.Literal("]")
|
||||
).setResultsName("register_expression")
|
||||
|
||||
@@ -373,7 +378,7 @@ class ParserX86Intel(ParserX86):
|
||||
self.register.setResultsName("segment") + pp.Literal(":") + immediate
|
||||
^ immediate + register_expression
|
||||
^ register_expression
|
||||
^ identifier + pp.Optional(pp.Literal("+") + immediate)
|
||||
^ identifier + pp.Optional(operator + immediate)
|
||||
).setResultsName("address_expression")
|
||||
|
||||
offset_expression = pp.Group(
|
||||
@@ -665,9 +670,11 @@ class ParserX86Intel(ParserX86):
|
||||
if indexed:
|
||||
index = indexed.get("index")
|
||||
scale = int(indexed.get("scale", "1"), 0)
|
||||
displacement_op = (
|
||||
self.process_immediate(displacement.immediate) if displacement else None
|
||||
)
|
||||
if register_expression.get("operator_index") == "-":
|
||||
scale *= -1
|
||||
displacement_op = self.process_immediate(displacement.immediate) if displacement else None
|
||||
if displacement_op and register_expression.get("operator_disp") == "-":
|
||||
displacement_op.value *= -1
|
||||
base_op = RegisterOperand(name=base.name) if base else None
|
||||
index_op = RegisterOperand(name=index.name) if index else None
|
||||
new_memory = MemoryOperand(
|
||||
@@ -724,6 +731,8 @@ class ParserX86Intel(ParserX86):
|
||||
if "displacement" in offset_expression
|
||||
else None
|
||||
)
|
||||
if displacement and "operator_disp" == "-":
|
||||
displacement.value *= -1
|
||||
identifier = self.process_identifier(offset_expression.identifier)
|
||||
identifier.offset = displacement
|
||||
return MemoryOperand(offset=identifier)
|
||||
|
||||
Reference in New Issue
Block a user