diff options
| author | Ajax <commial@gmail.com> | 2017-01-13 17:26:04 +0100 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2017-01-13 17:26:47 +0100 |
| commit | 49d009a0fabd96e930a7f0233b3b5525bdec2957 (patch) | |
| tree | 6c83406a5204823027bfe76542487cd6e471d12b | |
| parent | 632f95b8ce745ef77ecb9f46054c1964ddc59e3e (diff) | |
| download | miasm-49d009a0fabd96e930a7f0233b3b5525bdec2957.tar.gz miasm-49d009a0fabd96e930a7f0233b3b5525bdec2957.zip | |
Div: fix modint operation
| -rw-r--r-- | miasm2/expression/modint.py | 16 | ||||
| -rw-r--r-- | test/expression/modint.py | 6 |
2 files changed, 15 insertions, 7 deletions
diff --git a/miasm2/expression/modint.py b/miasm2/expression/modint.py index 90dabfac..b6a0e4ee 100644 --- a/miasm2/expression/modint.py +++ b/miasm2/expression/modint.py @@ -41,11 +41,15 @@ class moduint(object): return self.__class__(self.arg & y) def __div__(self, y): + # Python: 8 / -7 == -2 (C-like: -1) + # int(float) trick cannot be used, due to information loss + den = int(y) + num = int(self) + result_sign = 1 if (den * num) >= 0 else -1 + cls = self.__class__ if isinstance(y, moduint): cls = self.maxcast(y) - return cls(int(float(self.arg) / y.arg)) - else: - return self.__class__(int(float(self.arg) / y)) + return ((abs(num) / abs(den)) * result_sign) def __int__(self): return int(self.arg) @@ -64,11 +68,11 @@ class moduint(object): return self.__class__(self.arg << y) def __mod__(self, y): + # See __div__ for implementation choice + cls = self.__class__ if isinstance(y, moduint): cls = self.maxcast(y) - return cls(self.arg - (y.arg * int(float(self.arg)/y.arg))) - else: - return self.__class__(self.arg - (y * int(float(self.arg)/y))) + return cls(self.arg - (y * (self / y))) def __mul__(self, y): if isinstance(y, moduint): diff --git a/test/expression/modint.py b/test/expression/modint.py index e7c19d0c..f353bc21 100644 --- a/test/expression/modint.py +++ b/test/expression/modint.py @@ -8,7 +8,7 @@ d = uint1(0) e = uint1(1) f = uint8(0x1) - +g = int8(-3) print a, b, c print a + b, a + c, b + c @@ -53,6 +53,10 @@ assert(f ^ f == 0) assert(f ^ 0 == f) assert(0 ^ f == f) assert(1 ^ f == 0) +assert(c / g == -1) +assert(c / -3 == -1) +assert(c % g == 1) +assert(c % -3 == 1) print e + c, c + e, c - e, e - c print 1000 * a |