summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--src/arch/immediate.c11
-rwxr-xr-xtests/arch/immediate.py62
3 files changed, 77 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 841c7e1..1008968 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
17-03-26 Cyrille Bagard <nocbos@gmail.com>
+ * src/arch/immediate.c:
+ Fix the conversion of immediate operands to binary strings.
+
+ * tests/arch/immediate.py:
+ New entry: add some tests for immediate operands.
+
+17-03-26 Cyrille Bagard <nocbos@gmail.com>
+
* plugins/pychrysa/arch/Makefile.am:
Add the 'immediate.[ch]' and 'operand.[ch]' files to
libpychrysaarch_la_SOURCES.
diff --git a/src/arch/immediate.c b/src/arch/immediate.c
index 5970f06..1b13ea1 100644
--- a/src/arch/immediate.c
+++ b/src/arch/immediate.c
@@ -759,7 +759,11 @@ static size_t _g_imm_operand_to_string(const GImmOperand *operand, AsmSyntax syn
}
/* Modification de la longueur fournie */
- lmod = lmod_defs[range];
+
+ if (display != IOD_BIN)
+ lmod = lmod_defs[range];
+ else
+ lmod = "";
/* Spécification de la conversion */
@@ -774,7 +778,8 @@ static size_t _g_imm_operand_to_string(const GImmOperand *operand, AsmSyntax syn
else
{
if (operand->zpad)
- max = range * 8 + 1;
+ max = range * 8;
+
else
{
if (!msb_64(operand->raw, &max))
@@ -782,8 +787,6 @@ static size_t _g_imm_operand_to_string(const GImmOperand *operand, AsmSyntax syn
conv = "0";
max = 0;
}
- else
- max++;
}
if (max > 0)
diff --git a/tests/arch/immediate.py b/tests/arch/immediate.py
new file mode 100755
index 0000000..b3ddc6d
--- /dev/null
+++ b/tests/arch/immediate.py
@@ -0,0 +1,62 @@
+#!/usr/bin/python3-dbg
+# -*- coding: utf-8 -*-
+
+
+import pychrysalide
+from chrysacase import ChrysalideTestCase
+from pychrysalide import arch
+from pychrysalide.arch import ImmOperand
+
+
+
+class TestImmediate(ChrysalideTestCase):
+ """TestCase for arch.ImmOperand."""
+
+
+ def validateValue(self, value, size, padding, syntax, strings):
+ """Check all kinds of things with a given immediate operand."""
+
+ display = [
+ ImmOperand.IOD_BIN, ImmOperand.IOD_OCT,
+ ImmOperand.IOD_DEC,
+ ImmOperand.IOD_HEX
+ ]
+
+ for d in display:
+
+ op = ImmOperand(size, value)
+
+ self.assertTrue(op.size == size)
+ self.assertTrue(op.value == value)
+
+ op.padding = padding
+ op.display = d
+
+ string = op.to_string(syntax)
+ self.assertEqual(string, strings[d])
+
+
+ def testByteOne(self):
+ """Run sanity checks on immediate operand with value 1."""
+
+ strings = {
+ ImmOperand.IOD_BIN: 'b1',
+ ImmOperand.IOD_OCT: '01',
+ ImmOperand.IOD_DEC: '1',
+ ImmOperand.IOD_HEX: '0x1'
+ }
+
+ self.validateValue(1, arch.MDS_8_BITS_UNSIGNED, False, arch.ASX_INTEL, strings)
+
+
+ def testByteOnePadded(self):
+ """Run sanity checks on immediate operand with padded value 1."""
+
+ strings = {
+ ImmOperand.IOD_BIN: 'b00000001',
+ ImmOperand.IOD_OCT: '01',
+ ImmOperand.IOD_DEC: '1',
+ ImmOperand.IOD_HEX: '0x01'
+ }
+
+ self.validateValue(1, arch.MDS_8_BITS_UNSIGNED, True, arch.ASX_INTEL, strings)