udis86sx/UDIS86.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 25 Jun 2018 15:45:17 +0100
changeset 48 d55d740fb1fc
parent 23 d2d9a2d4d6bf
child 50 7f439240d923
permissions -rw-r--r--
UDIS86: Added support for inspecting operands
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
     1
"
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
     2
    Copyright (c) 2016-now, Jan Vrany <jan . vrany [at] fit . cvut . cz>
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
     3
    All rights reserved.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
     4
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
     5
    Redistribution and use in source and binary forms, with or without modification, 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
     6
    are permitted provided that the following conditions are met:
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
     7
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
     8
    1. Redistributions of source code must retain the above copyright notice, 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
     9
       this list of conditions and the following disclaimer.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    10
    2. Redistributions in binary form must reproduce the above copyright notice, 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    11
       this list of conditions and the following disclaimer in the documentation 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    12
       and/or other materials provided with the distribution.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    13
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    14
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    15
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    16
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    17
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    18
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    19
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    20
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    21
    ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    22
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    23
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    24
"
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
"{ Package: 'jv:dragonfly/udis86sx' }"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
"{ NameSpace: Smalltalk }"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
Object subclass:#UDIS86
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
	instanceVariableNames:'handle buffer'
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
	classVariableNames:''
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
	poolDictionaries:''
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
	category:'UDIS86'
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
!UDIS86 primitiveDefinitions!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
/*
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
 * includes, defines, structure definitions
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
 * and typedefs come here.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
 */
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
#include <udis86.h>
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
#define ud ((ud_t*)(&__byteArrayVal( __INST(handle) )))
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
%}
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
!UDIS86 class methodsFor:'documentation'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
23
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    53
copyright
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    54
"
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    55
    Copyright (c) 2016-now, Jan Vrany <jan . vrany [at] fit . cvut . cz>
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    56
    All rights reserved.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    57
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    58
    Redistribution and use in source and binary forms, with or without modification, 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    59
    are permitted provided that the following conditions are met:
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    60
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    61
    1. Redistributions of source code must retain the above copyright notice, 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    62
       this list of conditions and the following disclaimer.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    63
    2. Redistributions in binary form must reproduce the above copyright notice, 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    64
       this list of conditions and the following disclaimer in the documentation 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    65
       and/or other materials provided with the distribution.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    66
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    67
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    68
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    69
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    70
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    71
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    72
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    73
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    74
    ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    75
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    76
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    77
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    78
"
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    79
!
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
    80
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
documentation
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
    Intel X86 disassembler for both i386 and x86_64 code.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
    Based on Vivek Thampi's udis86 C library
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
    [author:]
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
        Jan Vrany <jan.vrany@fit.cvut.cz>
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
    [instance variables:]
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
    [class variables:]
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
    [see also:]
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
        udis86 https://github.com/vmt/udis86
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
!UDIS86 class methodsFor:'instance creation'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
new
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
    "return an initialized instance"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
    ^ self basicNew initialize.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
!UDIS86 class methodsFor:'examples'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
example1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
    | code disas insn |
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
    code := #[ 16r81 16rc3 16r9d 16r12 16r00 16r00  "/ add    $0x129d,%ebx
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
               16r68 16r40 16r94 16r04 16r08        "/ push   $0x8049440
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
               16re8 16r6f 16rfe 16rff 16rff        "/  call   8048310
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
            ]. 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
    disas := UDIS86 new.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
    disas buffer: code pc: 16r00FF0000.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
    "/ Disassemble the code, print assembly
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
    "/ on Transcript
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
    [ (insn := disas disassemble) notNil ] whileTrue:[
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
        Transcript showCR: insn printString.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
    ]
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
    "
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
    UDIS86 example1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
    "
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
    "Created: / 10-12-2015 / 16:54:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
48
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   130
    "Modified: / 25-06-2018 / 16:56:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
!UDIS86 class methodsFor:'utilities'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
6
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
   135
disassemble: buffer
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
   136
    ^ String streamContents:[ :s | self disassemble: buffer on: s ]
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
   137
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
   138
    "Created: / 11-01-2016 / 20:58:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
   139
!
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
   140
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
disassemble: buffer on: stream
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
    self disassemble: buffer pc: 0 on: stream
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   143
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
    "Created: / 11-12-2015 / 10:15:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
    "Modified: / 11-12-2015 / 21:32:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
disassemble: buffer pc: pc on: stream
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
    | disasm insn |
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   150
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   151
    disasm := UDIS86 new.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   152
    disasm buffer: buffer pc: pc.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   153
    [ (insn := disasm disassemble) notNil ] whileTrue:[ 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
        stream nextPutLine: insn printString
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
    ].
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   157
    "Created: / 11-12-2015 / 21:32:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   158
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   159
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   160
!UDIS86 methodsFor:'accessing'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   161
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   162
buffer: aByteArrayOrExternalBytes
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   163
    "Set the input buffer containing instructions for
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   164
     disassembling."
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   165
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   166
    | buff pc |
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   167
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   168
    buff := aByteArrayOrExternalBytes asExternalBytes.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   169
    aByteArrayOrExternalBytes isExternalBytes ifTrue:[ 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   170
        pc := aByteArrayOrExternalBytes address.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   171
    ].
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   172
    self buffer: buff pc: pc
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   173
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   174
    "Created: / 09-12-2015 / 22:54:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   175
    "Modified: / 11-12-2015 / 16:10:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   176
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   177
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   178
buffer: aByteArray pc: anInteger
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   179
    "Set the input buffer containing instructions for
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   180
     disassembling."
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   181
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   182
    | bufferLen pc |
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   183
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   184
    buffer := aByteArray asExternalBytes.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   185
    bufferLen := buffer size.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   186
    pc := anInteger ? 0.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   187
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   188
    if ( __isExternalAddressLike( _INST( buffer ) ) &&
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   189
         __isSmallInteger( bufferLen ) &&
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   190
         __isSmallInteger( pc ) ) {
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   191
        ud_set_input_buffer(ud, __externalAddressVal( __INST( buffer ) ), __intVal( bufferLen ) );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   192
        ud_set_pc(ud, __intVal( pc ) );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   193
        RETURN ( self );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
    }
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   195
%}.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   196
    self primitiveFailed
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   197
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   198
    "Created: / 11-12-2015 / 16:07:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   199
    "Modified: / 11-12-2015 / 21:20:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   200
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   201
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   202
mode: anInteger
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   203
    "Sets the mode of disassembly. Possible values are 16, 32, and 64. 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   204
     By default it uses 32bit mode when running VM is 32bit, 64bit if
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   205
     it's 64bit one"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   206
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   207
    self assert: (#(16 32 64) includes: anInteger).
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   208
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   209
    ud_set_mode( ud, __intVal ( anInteger ) );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   210
%}.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   211
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   212
    "Created: / 09-12-2015 / 23:01:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   213
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   214
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   215
useSyntaxATT
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   216
    "Sets AT&T syntax for assembly.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   217
     See http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   218
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   219
    ud_set_syntax ( ud, UD_SYN_ATT );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   220
%}
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   221
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   222
    "Created: / 10-12-2015 / 21:34:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   223
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   224
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   225
useSyntaxIntel
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   226
    "Sets Intel syntax for assembly.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   227
     See http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   228
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   229
    ud_set_syntax ( ud, UD_SYN_INTEL );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   230
%}
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   231
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   232
    "Created: / 10-12-2015 / 21:33:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   233
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   234
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   235
!UDIS86 methodsFor:'disassembling'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   236
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   237
disassemble
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   238
    "Disassembles the next instruction in the input buffer/stream.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   239
     Returns the number of bytes disassembled. A 0 indicates end of input."
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   240
48
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   241
    | pc length mnemonic assembly opr0 opr1 opr2 |
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   242
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   243
    opr0 := UDIS86Operand new.
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   244
    opr1 := UDIS86Operand new.
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   245
    opr2 := UDIS86Operand new.
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   246
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   247
    if (! ud_disassemble ( ud ) ) { 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   248
        RETURN (nil);
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   249
    }
48
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   250
    pc = __MKSMALLINT( ud_insn_off ( ud ) );
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   251
    length = __MKSMALLINT( ud_insn_len ( ud ) );
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   252
    mnemonic = __MKSMALLINT( ud_insn_mnemonic ( ud ) );
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   253
    assembly = __MKSTRING( ud_insn_asm ( ud ) );
48
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   254
#define OPERAND_INIT(n)                         \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   255
    {                                           \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   256
        const ud_operand_t* _opr##n;            \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   257
        _opr##n = ud_insn_opr( ud, n);          \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   258
        if (_opr##n == NULL) {                  \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   259
            opr##n = nil;                       \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   260
        } else {                                \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   261
            memcpy( __byteArrayVal(opr##n),     \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   262
                    _opr##n,                    \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   263
                    sizeof(ud_operand_t) );     \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   264
        }                                       \
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   265
    }
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   266
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   267
    OPERAND_INIT(0);
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   268
    OPERAND_INIT(1);
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   269
    OPERAND_INIT(2);
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   270
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   271
#undef OPERAND_INIT
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   272
%}.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   273
    ^ UDIS86Instruction new
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   274
        setAssembly: assembly;
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   275
        setPC: pc;
48
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   276
        setLength: length;
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   277
        setMnemonic: mnemonic;    
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   278
        setOperand0: opr0;
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   279
        setOperand1: opr1;
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   280
        setOperand2: opr2;
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   281
        yourself.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   282
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   283
    "Created: / 09-12-2015 / 22:57:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   284
    "Modified: / 11-12-2015 / 21:23:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
48
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   285
!
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   286
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   287
disassemble: bytes
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   288
    "Disassembles all instructions from `bytes` assuming first instruction
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   289
     is at PC 0. Returns a collection of UDIS86Instruction."
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   290
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   291
     ^ self disassemble: bytes pc: 0
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   292
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   293
    "Created: / 26-06-2018 / 11:14:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   294
!
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   295
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   296
disassemble: bytes pc: pc
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   297
    "Disassembles all instructions from `bytes` assuming first instruction
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   298
     is at given `pc`. Returns a collection of UDIS86Instruction."
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   299
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   300
    | instructions instruction |
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   301
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   302
    self buffer: bytes pc: pc.
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   303
    instructions := OrderedCollection new.
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   304
    [ (instruction := self disassemble) notNil ] whileTrue:[ 
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   305
        instructions add: instruction
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   306
    ].
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   307
    ^ instructions.
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   308
d55d740fb1fc UDIS86: Added support for inspecting operands
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   309
    "Created: / 26-06-2018 / 11:10:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   310
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   311
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   312
!UDIS86 methodsFor:'initialization'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   313
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   314
initialize
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   315
    | handleSize |
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   316
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   317
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   318
    handleSize = __MKSMALLINT( sizeof( ud_t ) );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   319
%}.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   320
    handle := ByteArray new: handleSize.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   321
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   322
    ud_init( ud );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   323
    ud_set_syntax ( ud, UD_SYN_INTEL );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   324
%}.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   325
    ExternalAddress pointerSize == 8 ifTrue:[ 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   326
        self mode: 64.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   327
    ] ifFalse:[ 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   328
        self mode: 32.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   329
    ].
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   330
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   331
    "
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   332
    UDIS86 new
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   333
    "
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   334
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   335
    "Modified: / 10-12-2015 / 21:26:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   336
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   337
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   338
!UDIS86 class methodsFor:'documentation'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   339
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   340
version_HG
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   341
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   342
    ^ '$Changeset: <not expanded> $'
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   343
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   344