udis86sx/UDIS86.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 27 Jan 2016 08:34:29 +0000
changeset 15 eccc20e9c2e1
parent 6 ff36d8318020
child 23 d2d9a2d4d6bf
permissions -rw-r--r--
Added subpackage c1 for LLVM based compiler.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
"{ Package: 'jv:dragonfly/udis86sx' }"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
"{ NameSpace: Smalltalk }"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
Object subclass:#UDIS86
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
	instanceVariableNames:'handle buffer'
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
	classVariableNames:''
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
	poolDictionaries:''
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
	category:'UDIS86'
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
!UDIS86 primitiveDefinitions!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
/*
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
 * includes, defines, structure definitions
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
 * and typedefs come here.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
 */
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
#include <udis86.h>
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
#define ud ((ud_t*)(&__byteArrayVal( __INST(handle) )))
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
%}
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
! !
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
!UDIS86 class methodsFor:'documentation'!
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
documentation
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
    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
    32
    Based on Vivek Thampi's udis86 C library
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
    [author:]
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
        Jan Vrany <jan.vrany@fit.cvut.cz>
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
    [instance variables:]
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
    [class variables:]
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
    [see also:]
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
        udis86 https://github.com/vmt/udis86
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
"
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
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
!UDIS86 class methodsFor:'instance creation'!
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
new
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
    "return an initialized instance"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
    ^ self basicNew initialize.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
!UDIS86 class methodsFor:'examples'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
example1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
    | code disas insn |
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
    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
    61
               16r68 16r40 16r94 16r04 16r08        "/ push   $0x8049440
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
               16re8 16r6f 16rfe 16rff 16rff        "/  call   8048310
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
            ]. 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
    disas := UDIS86 new.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
    disas buffer: code pc: 16r00FF0000.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
    "/ Disassemble the code, print assembly
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
    "/ on Transcript
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
    [ (insn := disas disassemble) notNil ] whileTrue:[
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
        Transcript showCR: insn printString.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
    ]
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
    "
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
    UDIS86 example1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
    "
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
    "Created: / 10-12-2015 / 16:54:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
    "Modified: / 11-12-2015 / 21:30:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
!UDIS86 class methodsFor:'utilities'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
6
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
    83
disassemble: buffer
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
    84
    ^ 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
    85
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
    86
    "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
    87
!
ff36d8318020 Added utility method UDIS86 class>>disassemble:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 1
diff changeset
    88
1
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
disassemble: buffer on: stream
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
    self disassemble: buffer pc: 0 on: stream
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
    "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
    93
    "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
    94
!
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
disassemble: buffer pc: pc on: stream
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
    | disasm insn |
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
    disasm := UDIS86 new.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
    disasm buffer: buffer pc: pc.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
    [ (insn := disasm disassemble) notNil ] whileTrue:[ 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
        stream nextPutLine: insn printString
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
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
    "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
   106
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
!UDIS86 methodsFor:'accessing'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
buffer: aByteArrayOrExternalBytes
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
    "Set the input buffer containing instructions for
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
     disassembling."
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
    | buff pc |
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
    buff := aByteArrayOrExternalBytes asExternalBytes.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
    aByteArrayOrExternalBytes isExternalBytes ifTrue:[ 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
        pc := aByteArrayOrExternalBytes address.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
    ].
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
    self buffer: buff pc: pc
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
    "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
   123
    "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
   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
buffer: aByteArray pc: anInteger
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
    "Set the input buffer containing instructions for
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
     disassembling."
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
    | bufferLen pc |
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
    buffer := aByteArray asExternalBytes.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
    bufferLen := buffer size.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
    pc := anInteger ? 0.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
    if ( __isExternalAddressLike( _INST( buffer ) ) &&
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
         __isSmallInteger( bufferLen ) &&
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
         __isSmallInteger( pc ) ) {
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
        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
   140
        ud_set_pc(ud, __intVal( pc ) );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
        RETURN ( self );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
    }
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
    self primitiveFailed
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
    "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
   147
    "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
   148
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   150
mode: anInteger
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   151
    "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
   152
     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
   153
     it's 64bit one"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
    self assert: (#(16 32 64) includes: anInteger).
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
    ud_set_mode( ud, __intVal ( anInteger ) );
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
    "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
   161
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   162
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   163
useSyntaxATT
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   164
    "Sets AT&T syntax for assembly.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   165
     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
   166
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   167
    ud_set_syntax ( ud, UD_SYN_ATT );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   168
%}
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   169
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   170
    "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
   171
!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   172
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   173
useSyntaxIntel
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   174
    "Sets Intel syntax for assembly.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   175
     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
   176
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   177
    ud_set_syntax ( ud, UD_SYN_INTEL );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   178
%}
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   179
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   180
    "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
   181
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   182
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   183
!UDIS86 methodsFor:'disassembling'!
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   184
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   185
disassemble
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   186
    "Disassembles the next instruction in the input buffer/stream.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   187
     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
   188
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   189
    | pc opcodeCode assembly |
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   190
%{
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   191
    if (! ud_disassemble ( ud ) ) { 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   192
        RETURN (nil);
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   193
    }
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
    opcodeCode = __MKSMALLINT( ud_insn_mnemonic ( ud ) );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   195
    assembly = __MKSTRING( ud_insn_asm ( ud ) );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   196
    pc = __MKSMALLINT( ud_insn_off ( ud ) );
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
    ^ UDIS86Instruction new
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   199
        setAssembly: assembly;
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   200
        setPC: pc;
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   201
        setOpcodeCode: opcodeCode;    
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   202
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   203
        yourself.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   204
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   205
    "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
   206
    "Modified: / 11-12-2015 / 21:23:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   207
! !
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
!UDIS86 methodsFor:'initialization'!
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
initialize
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   212
    | handleSize |
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
    handleSize = __MKSMALLINT( sizeof( ud_t ) );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   216
%}.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   217
    handle := ByteArray new: handleSize.
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_init( ud );
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   220
    ud_set_syntax ( ud, UD_SYN_INTEL );
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
    ExternalAddress pointerSize == 8 ifTrue:[ 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   223
        self mode: 64.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   224
    ] ifFalse:[ 
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   225
        self mode: 32.
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   226
    ].
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   227
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
    UDIS86 new
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
    "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
   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 class methodsFor:'documentation'!
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
version_HG
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   238
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   239
    ^ '$Changeset: <not expanded> $'
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   240
! !
aa002d0c231b Initial support for disassembling
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   241