Files
OSACA/osaca/parser/memory.py

166 lines
3.8 KiB
Python

#!/usr/bin/env python3
from osaca.parser.operand import Operand
class MemoryOperand(Operand):
def __init__(
self,
offset=None,
base=None,
index=None,
scale=1,
segment_ext=None,
mask=None,
pre_indexed=False,
post_indexed=False,
indexed_val=None,
data_type=None,
src=None,
dst=None,
source=False,
destination=False,
):
super().__init__(source, destination)
self._offset = offset
self._base = base
self._index = index
self._scale = scale
self._segment_ext = segment_ext
self._mask = mask
self._pre_indexed = pre_indexed
self._post_indexed = post_indexed
self._indexed_val = indexed_val
self._data_type = data_type
# type of register we store from (`src`) or load to (`dst`)
self._src = src
self._dst = dst
@property
def offset(self):
return self._offset
@property
def immediate(self):
return self._immediate_id
@property
def base(self):
return self._base
@property
def index(self):
return self._index
@property
def scale(self):
return self._scale
@property
def segment_ext(self):
return self._segment_ext
@property
def mask(self):
return self._mask
@property
def pre_indexed(self):
return self._pre_indexed
@property
def post_indexed(self):
return self._post_indexed
@property
def indexed_val(self):
return self._indexed_val
@property
def data_type(self):
return self._data_type
@data_type.setter
def data_type(self, data_type):
self._data_type = data_type
@property
def src(self):
return self._src
@src.setter
def src(self, src):
self._src = src
@property
def dst(self):
return self._dst
@dst.setter
def dst(self, dst):
self._dst = dst
@segment_ext.setter
def segment_ext(self, segment):
self._segment_ext = segment
@offset.setter
def offset(self, offset):
self._offset = offset
@base.setter
def base(self, base):
self._base = base
@index.setter
def index(self, index):
self._index = index
@scale.setter
def scale(self, scale):
self._scale = scale
@mask.setter
def mask(self, mask):
self._mask = mask
@pre_indexed.setter
def pre_indexed(self, pre_indexed):
self._pre_indexed = pre_indexed
@post_indexed.setter
def post_indexed(self, post_indexed):
self._post_indexed = post_indexed
@indexed_val.setter
def indexed_val(self, value):
self._indexed_val = value
def __str__(self):
return (
f"MemoryOperand(offset={self._offset}, "
f"base={self._base}, index={self._index}, scale={self._scale}, "
f"segment_ext={self._segment_ext}, mask={self._mask}, "
f"pre_indexed={self._pre_indexed}, post_indexed={self._post_indexed}, "
f"indexed_val={self._indexed_val},"
f"source={self._source}, destination={self._destination})"
)
def __repr__(self):
return self.__str__()
def __eq__(self, other):
if isinstance(other, MemoryOperand):
return (
self._offset == other._offset
and self._base == other._base
and self._index == other._index
and self._scale == other._scale
and self._segment_ext == other._segment_ext
and self._mask == other._mask
and self._pre_indexed == other._pre_indexed
and self._post_indexed == other._post_indexed
and self._indexed_val == other._indexed_val
)
return False