Mercurial > lcfOS
comparison python/testx86asm.py @ 191:6b2bec5653f1
Added assembler testset
author | Windel Bouwman |
---|---|
date | Sun, 26 May 2013 15:28:07 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
190:65dda7e7e8bd | 191:6b2bec5653f1 |
---|---|
1 #!/usr/bin/python | |
2 | |
3 import unittest | |
4 | |
5 | |
6 class AssemblerTestCase(unittest.TestCase): | |
7 """ | |
8 test methods start with 'test*' | |
9 Checks several assembly constructs agains their bytecodes | |
10 """ | |
11 def setUp(self): | |
12 self.skipTest('not implemented yet') | |
13 self.assembler = Assembler('x86-64') | |
14 | |
15 def tstAssembler(self): | |
16 """ Check all kind of assembler cases """ | |
17 assert(assembler.shortjump(5) == [0xeb, 0x5]) | |
18 assert(assembler.shortjump(-2) == [0xeb, 0xfc]) | |
19 assert(assembler.shortjump(10,'GE') == [0x7d, 0xa]) | |
20 assert(assembler.nearjump(5) == [0xe9, 0x5,0x0,0x0,0x0]) | |
21 assert(assembler.nearjump(-2) == [0xe9, 0xf9, 0xff,0xff,0xff]) | |
22 assert(assembler.nearjump(10,'LE') == [0x0f, 0x8e, 0xa,0x0,0x0,0x0]) | |
23 | |
24 def testCall(self): | |
25 assert(assembler.call('r10') == [0x41, 0xff, 0xd2]) | |
26 assert(assembler.call('rcx') == [0xff, 0xd1]) | |
27 def testXOR(self): | |
28 assert(assembler.xorreg64('rax', 'rax') == [0x48, 0x31, 0xc0]) | |
29 assert(assembler.xorreg64('r9', 'r8') == [0x4d, 0x31, 0xc1]) | |
30 assert(assembler.xorreg64('rbx', 'r11') == [0x4c, 0x31, 0xdb]) | |
31 | |
32 def testINC(self): | |
33 assert(assembler.increg64('r11') == [0x49, 0xff, 0xc3]) | |
34 assert(assembler.increg64('rcx') == [0x48, 0xff, 0xc1]) | |
35 | |
36 def testPush(self): | |
37 assert(assembler.push('rbp') == [0x55]) | |
38 assert(assembler.push('rbx') == [0x53]) | |
39 assert(assembler.push('r12') == [0x41, 0x54]) | |
40 def testPop(self): | |
41 assert(assembler.pop('rbx') == [0x5b]) | |
42 assert(assembler.pop('rbp') == [0x5d]) | |
43 assert(assembler.pop('r12') == [0x41, 0x5c]) | |
44 | |
45 def testAsmLoads(self): | |
46 # TODO constant add testcases | |
47 assert(assembler.mov('rbx', 'r14') == [0x4c, 0x89, 0xf3]) | |
48 assert(assembler.mov('r12', 'r8') == [0x4d, 0x89, 0xc4]) | |
49 assert(assembler.mov('rdi', 'rsp') == [0x48, 0x89, 0xe7]) | |
50 | |
51 def testAsmMemLoads(self): | |
52 assert(assembler.mov('rax', ['r8','r15',0x11]) == [0x4b,0x8b,0x44,0x38,0x11]) | |
53 assert(assembler.mov('r13', ['rbp','rcx',0x23]) == [0x4c,0x8b,0x6c,0xd,0x23]) | |
54 | |
55 assert(assembler.mov('r9', ['rbp',-0x33]) == [0x4c,0x8b,0x4d,0xcd]) | |
56 #assert(assembler.movreg64('rbx', ['rax']) == [0x48, 0x8b,0x18]) | |
57 | |
58 assert(assembler.mov('rax', [0xb000]) == [0x48,0x8b,0x4,0x25,0x0,0xb0,0x0,0x0]) | |
59 assert(assembler.mov('r11', [0xa0]) == [0x4c,0x8b,0x1c,0x25,0xa0,0x0,0x0,0x0]) | |
60 | |
61 assert(assembler.mov('r11', ['RIP', 0xf]) == [0x4c,0x8b,0x1d,0x0f,0x0,0x0,0x0]) | |
62 | |
63 def testAsmMemStores(self): | |
64 assert(assembler.mov(['rbp', 0x13],'rbx') == [0x48,0x89,0x5d,0x13]) | |
65 assert(assembler.mov(['r12', 0x12],'r9') == [0x4d,0x89,0x4c,0x24,0x12]) | |
66 assert(assembler.mov(['rcx', 0x11],'r14') == [0x4c,0x89,0x71,0x11]) | |
67 | |
68 | |
69 assert(assembler.mov([0xab], 'rbx') == [0x48,0x89,0x1c,0x25,0xab,0x0,0x0,0x0]) | |
70 assert(assembler.mov([0xcd], 'r13') == [0x4c,0x89,0x2c,0x25,0xcd,0x0,0x0,0x0]) | |
71 | |
72 assert(assembler.mov(['RIP', 0xf], 'r9') == [0x4c,0x89,0x0d,0x0f,0x0,0x0,0x0]) | |
73 | |
74 def testAsmMOV8(self): | |
75 assert(assembler.mov(['rbp', -8], 'al') == [0x88, 0x45, 0xf8]) | |
76 assert(assembler.mov(['r11', 9], 'cl') == [0x41, 0x88, 0x4b, 0x09]) | |
77 | |
78 assert(assembler.mov(['rbx'], 'al') == [0x88, 0x03]) | |
79 assert(assembler.mov(['r11'], 'dl') == [0x41, 0x88, 0x13]) | |
80 | |
81 def testAsmLea(self): | |
82 assert(assembler.leareg64('r11', ['RIP', 0xf]) == [0x4c,0x8d,0x1d,0x0f,0x0,0x0,0x0]) | |
83 assert(assembler.leareg64('rsi', ['RIP', 0x7]) == [0x48,0x8d,0x35,0x07,0x0,0x0,0x0]) | |
84 | |
85 assert(assembler.leareg64('rcx', ['rbp', -8]) == [0x48,0x8d,0x4d,0xf8]) | |
86 | |
87 def testAssemblerCMP(self): | |
88 assert(assembler.cmpreg64('rdi', 'r13') == [0x4c, 0x39, 0xef]) | |
89 assert(assembler.cmpreg64('rbx', 'r14') == [0x4c, 0x39, 0xf3]) | |
90 assert(assembler.cmpreg64('r12', 'r9') == [0x4d, 0x39, 0xcc]) | |
91 | |
92 assert(assembler.cmpreg64('rdi', 1) == [0x48, 0x83, 0xff, 0x01]) | |
93 assert(assembler.cmpreg64('r11', 2) == [0x49, 0x83, 0xfb, 0x02]) | |
94 def testAssemblerADD(self): | |
95 assert(assembler.addreg64('rbx', 'r13') == [0x4c, 0x01, 0xeb]) | |
96 assert(assembler.addreg64('rax', 'rbx') == [0x48, 0x01, 0xd8]) | |
97 assert(assembler.addreg64('r12', 'r13') == [0x4d, 0x01, 0xec]) | |
98 | |
99 assert(assembler.addreg64('rbx', 0x13) == [0x48, 0x83, 0xc3, 0x13]) | |
100 assert(assembler.addreg64('r11', 0x1234567) == [0x49, 0x81, 0xc3, 0x67, 0x45,0x23,0x1]) | |
101 assert(assembler.addreg64('rsp', 0x33) == [0x48, 0x83, 0xc4, 0x33]) | |
102 | |
103 def testAssemblerSUB(self): | |
104 assert(assembler.subreg64('rdx', 'r14') == [0x4c, 0x29, 0xf2]) | |
105 assert(assembler.subreg64('r15', 'rbx') == [0x49, 0x29, 0xdf]) | |
106 assert(assembler.subreg64('r8', 'r9') == [0x4d, 0x29, 0xc8]) | |
107 | |
108 assert(assembler.subreg64('rsp', 0x123456) == [0x48, 0x81, 0xec, 0x56,0x34,0x12,0x0]) | |
109 assert(assembler.subreg64('rsp', 0x12) == [0x48, 0x83, 0xec, 0x12]) | |
110 | |
111 def testAssemblerIDIV(self): | |
112 assert(assembler.idivreg64('r11') == [0x49, 0xf7, 0xfb]) | |
113 assert(assembler.idivreg64('rcx') == [0x48, 0xf7, 0xf9]) | |
114 assert(assembler.idivreg64('rsp') == [0x48, 0xf7, 0xfc]) | |
115 | |
116 def testAssemblerIMUL(self): | |
117 assert(assembler.imulreg64_rax('rdi') == [0x48, 0xf7, 0xef]) | |
118 assert(assembler.imulreg64_rax('r10') == [0x49, 0xf7, 0xea]) | |
119 assert(assembler.imulreg64_rax('rdx') == [0x48, 0xf7, 0xea]) | |
120 | |
121 assert(assembler.imulreg64('r11', 'rdi') == [0x4c, 0xf, 0xaf, 0xdf]) | |
122 assert(assembler.imulreg64('r12', 'rbx') == [0x4c, 0xf, 0xaf, 0xe3]) | |
123 # nasm generates this machine code: 0x4d, 0x6b, 0xff, 0xee | |
124 # This also works: 4D0FAFFE (another variant?? ) | |
125 assert(assembler.imulreg64('r15', 'r14') == [0x4d, 0x0f, 0xaf, 0xfe]) | |
126 | |
127 | |
128 if __name__ == '__main__': | |
129 unittest.main() | |
130 |