File: test_arm_arch.py

package info (click to toggle)
dissy 9-3
  • links: PTS, VCS
  • area: main
  • in suites: squeeze, wheezy
  • size: 340 kB
  • ctags: 320
  • sloc: python: 1,886; xml: 21; makefile: 5; sh: 5
file content (112 lines) | stat: -rwxr-xr-x 4,675 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/python
import sys
import os.path
import unittest
projdir = os.path.normpath(os.path.join(os.path.dirname(sys.argv[0]), '..'))
sys.path = [projdir] + sys.path
import dissy.architecture
from dissy.arm import ArmArchitecture
from dissy.Instruction import Instruction


def instr(opcode, args):
    #mock of function + file object
    class MockFunction():
        def __init__(self):
            self.baseAddress = 0
            self.arch = ArmArchitecture()
        def getFile(self):
            return self
        def getArch(self):
            return self.arch
    return Instruction(MockFunction(), 0, None, opcode, args)

class TestArmArch(unittest.TestCase):
    def setUp(self):
        self.arch = ArmArchitecture()
        self.assertNotEqual(self.arch, None)

    def test_arg_parsing(self):
        self.assertEqual(self.arch.parseArguments(instr('mov', 'r8, #6')),
            ([], ['r8'], [6]))
        self.assertEqual(self.arch.parseArguments(instr('mov', 'ip, #0')),
            ([], ['ip'], [0]))
        self.assertEqual(self.arch.parseArguments(instr('movle', 'r0, #1')),
            ([], ['r0'], [1]))
        self.assertEqual(self.arch.parseArguments(instr('cmp', 'r0, #1')),
            (['r0'], [], [1]))

        #Add og sub
        self.assertEqual(self.arch.parseArguments(instr('sub', 'sp, sp, #4')),
            (['sp'], ['sp'], [4]))
        self.assertEqual(self.arch.parseArguments(instr('add', 'sp, sp, #4')),
            (['sp'], ['sp'], [4]))
        self.assertEqual(self.arch.parseArguments(instr('add', 'r2, r2, #1')),
            (['r2'], ['r2'], [1]))
        self.assertEqual(self.arch.parseArguments(instr('addlt', 'r5, r5, r3')),
            (['r5', 'r3'], ['r5'], []))
        self.assertEqual(self.arch.parseArguments(instr('sub', 'r3, r3, r0, lsl #2')),
            (['r3', 'r0'], ['r3'], []))

        #shifts
        self.assertEqual(self.arch.parseArguments(instr('lsl', 'r1, r3, #7')),
            (['r3'], ['r1'], [7]))
        self.assertEqual(self.arch.parseArguments(instr('asr', 'r1, r2, #31')),
            (['r2'], ['r1'], [31]))
        self.assertEqual(self.arch.parseArguments(instr('rsb', 'r0, r1, r0, asr #9')),
            (['r1', 'r0'], ['r0'], []))
        self.assertEqual(self.arch.parseArguments(instr('lsl', 'r1, r3, #7')),
            (['r3'], ['r1'], [7]))

        #branches
        self.assertEqual(self.arch.parseArguments(instr('bl', '0')),
            ([], ['pc', 'lr'], []))
        self.assertEqual(self.arch.parseArguments(instr('bx', 'lr')),
            (['lr'], ['pc'], []))
        self.assertEqual(self.arch.parseArguments(instr('ble', '4c')),
            ([], ['pc'], []))

        #Dynamisk load
        self.assertEqual(self.arch.parseArguments(instr('ldr', 'r3, [ip]')),
            (['ip'], ['r3'], []))
        self.assertEqual(self.arch.parseArguments(instr('ldr', 'r3, [pc, #8]')),
            (['pc'], ['r3'], []))
        self.assertEqual(self.arch.parseArguments(instr('ldr', 'r3, [r2, r0]')),
            (['r2', 'r0'], ['r3'], []))
        #Dynamisk store
        self.assertEqual(self.arch.parseArguments(instr('str', 'r0, [r3]')),
            (['r0', 'r3'], [], []))
        self.assertEqual(self.arch.parseArguments(instr('str', 'r0, [r4, r5]')),
            (['r0', 'r4', 'r5'], [], []))

        #unimplemented instruction type
        self.assertRaises(ValueError, self.arch.parseArguments, instr('abemad', 'r1, r0'))

        #multiplication
        self.assertEqual(self.arch.parseArguments(instr('smull', 'r1, r0, r3, r2')),
            (['r3', 'r2'], ['r1', 'r0'], []))

        #multiplication
        self.assertEqual(self.arch.parseArguments(instr('mul', 'r0, r3, r2')),
            (['r3', 'r2'], ['r0'], []))
        self.assertEqual(self.arch.parseArguments(instr('mla', 'r1, r2, r3, r1')),
            (['r2', 'r3', 'r1'], ['r1'], []))

        #Push, pop
        self.assertEqual(self.arch.parseArguments(instr('push', '{lr}')),
            (['sp', 'lr'], ['sp'], []))
        self.assertEqual(self.arch.parseArguments(instr('push', '{r4, r5, lr}')),
            (['sp', 'r4', 'r5', 'lr'], ['sp'], []))
        self.assertEqual(self.arch.parseArguments(instr('pop', '{r4, r5, lr}')),
            (['sp'], ['sp', 'r4', 'r5', 'lr'], []))
        self.assertEqual(self.arch.parseArguments(instr('pop', '{lr}')),
            (['sp'], ['sp', 'lr'], []))

        #Assorted
        self.assertEqual(self.arch.parseArguments(instr('and', 'r3, r3, #31')),
            (['r3'], ['r3'], [31]))
        self.assertEqual(self.arch.parseArguments(instr('muls', 'r3, r4, r3')),
            (['r4', 'r3'], ['r3'], []))

if __name__ == '__main__':
    unittest.main()