1+ using FluentAssertions ;
2+ using Gee . External . Capstone ;
3+ using Gee . External . Capstone . Arm ;
4+ using System . Diagnostics . CodeAnalysis ;
5+ using Xunit ;
6+
7+ namespace Tests . Gee . External . Capstone . Arm ;
8+
9+ [ ExcludeFromCodeCoverage ]
10+ public sealed class CapstoneArmDisassemblerTests {
11+ [ Fact ]
12+ public void DisassembleArm_A ( ) {
13+ var binaryCode = new byte [ ] { 0x04 , 0xE0 , 0x2D , 0xE5 } ;
14+ using var disassembler = CapstoneDisassembler . CreateArmDisassembler ( ArmDisassembleMode . Arm ) ;
15+
16+ disassembler . DisassembleSyntax = DisassembleSyntax . Intel ;
17+ disassembler . EnableInstructionDetails = true ;
18+ var disassembledCode = disassembler . Disassemble ( binaryCode ) ;
19+ disassembledCode . Length . Should ( ) . Be ( 1 ) ;
20+
21+ var instruction = disassembledCode [ 0 ] ;
22+ instruction . DisassembleArchitecture . Should ( ) . Be ( DisassembleArchitecture . Arm ) ;
23+ instruction . DisassembleMode . Should ( ) . Be ( ArmDisassembleMode . Arm ) ;
24+ $ "{ instruction . Mnemonic } { instruction . Operand } ". Should ( ) . Be ( "str lr, [sp, #-4]!" ) ;
25+ }
26+
27+ [ Fact ]
28+ public void DisassembleArm_B ( ) {
29+ var binaryCode = new byte [ ] { 0xE0 , 0x83 , 0x22 , 0xE5 } ;
30+ using var disassembler = CapstoneDisassembler . CreateArmDisassembler ( ArmDisassembleMode . Arm ) ;
31+
32+ disassembler . DisassembleSyntax = DisassembleSyntax . Intel ;
33+ disassembler . EnableInstructionDetails = true ;
34+ var disassembledCode = disassembler . Disassemble ( binaryCode ) ;
35+ disassembledCode . Length . Should ( ) . Be ( 1 ) ;
36+
37+ var instruction = disassembledCode [ 0 ] ;
38+ instruction . DisassembleArchitecture . Should ( ) . Be ( DisassembleArchitecture . Arm ) ;
39+ instruction . DisassembleMode . Should ( ) . Be ( ArmDisassembleMode . Arm ) ;
40+ $ "{ instruction . Mnemonic } { instruction . Operand } ". Should ( ) . Be ( "str r8, [r2, #-0x3e0]!" ) ;
41+ }
42+
43+ [ Fact ]
44+ public void DisassembleArmV8_A ( ) {
45+ var binaryCode = new byte [ ] { 0xE0 , 0x3B , 0xB2 , 0xEE , 0x42 , 0x00 , 0x01 , 0xE1 , 0x51 , 0xF0 , 0x7F , 0xF5 } ;
46+ using var disassembler = CapstoneDisassembler . CreateArmDisassembler ( ArmDisassembleMode . Arm | ArmDisassembleMode . V8 ) ;
47+
48+ disassembler . DisassembleSyntax = DisassembleSyntax . Intel ;
49+ disassembler . EnableInstructionDetails = true ;
50+ var disassembledCode = disassembler . Disassemble ( binaryCode ) ;
51+ disassembledCode . Length . Should ( ) . Be ( 3 ) ;
52+
53+ var instruction = disassembledCode [ 0 ] ;
54+ instruction . DisassembleArchitecture . Should ( ) . Be ( DisassembleArchitecture . Arm ) ;
55+ instruction . DisassembleMode . Should ( ) . Be ( ArmDisassembleMode . Arm | ArmDisassembleMode . V8 ) ;
56+ $ "{ instruction . Mnemonic } { instruction . Operand } ". Should ( ) . Be ( "vcvtt.f64.f16 d3, s1" ) ;
57+
58+ instruction = disassembledCode [ 1 ] ;
59+ instruction . DisassembleArchitecture . Should ( ) . Be ( DisassembleArchitecture . Arm ) ;
60+ instruction . DisassembleMode . Should ( ) . Be ( ArmDisassembleMode . Arm | ArmDisassembleMode . V8 ) ;
61+ $ "{ instruction . Mnemonic } { instruction . Operand } ". Should ( ) . Be ( "crc32b r0, r1, r2" ) ;
62+
63+ instruction = disassembledCode [ 2 ] ;
64+ instruction . DisassembleArchitecture . Should ( ) . Be ( DisassembleArchitecture . Arm ) ;
65+ instruction . DisassembleMode . Should ( ) . Be ( ArmDisassembleMode . Arm | ArmDisassembleMode . V8 ) ;
66+ $ "{ instruction . Mnemonic } { instruction . Operand } ". Should ( ) . Be ( "dmb oshld" ) ;
67+ }
68+
69+ [ Fact ]
70+ public void DisassembleThumbCortexM_A ( ) {
71+ var binaryCode = new byte [ ] { 0xEF , 0xF3 , 0x02 , 0x80 } ;
72+ using var disassembler = CapstoneDisassembler . CreateArmDisassembler ( ArmDisassembleMode . Thumb | ArmDisassembleMode . CortexM ) ;
73+
74+ disassembler . DisassembleSyntax = DisassembleSyntax . Intel ;
75+ disassembler . EnableInstructionDetails = true ;
76+ var disassembledCode = disassembler . Disassemble ( binaryCode ) ;
77+ disassembledCode . Length . Should ( ) . Be ( 1 ) ;
78+
79+ var instruction = disassembledCode [ 0 ] ;
80+ instruction . DisassembleArchitecture . Should ( ) . Be ( DisassembleArchitecture . Arm ) ;
81+ instruction . DisassembleMode . Should ( ) . Be ( ArmDisassembleMode . Thumb | ArmDisassembleMode . CortexM ) ;
82+ $ "{ instruction . Mnemonic } { instruction . Operand } ". Should ( ) . Be ( "mrs r0, eapsr" ) ;
83+ }
84+ }
0 commit comments