Copyright | (c) Martin Grabmueller and Dirk Kleeblatt |
---|---|
License | BSD3 |
Maintainer | martin@grabmueller.de |
Stability | provisional |
Portability | portable |
Safe Haskell | None |
Language | Haskell98 |
Disassembler for x86 machine code.
This is a module for compatibility with earlier Harpy releases. It re-exports the disassembler from the disassembler package.
- data Opcode :: *
- data Operand :: *
- data InstrOperandSize :: *
- data Instruction :: *
- = BadInstruction Word8 String Int [Word8]
- | PseudoInstruction Int String
- | Instruction { }
- data ShowStyle :: *
- disassembleBlock :: Ptr Word8 -> Int -> IO (Either ParseError [Instruction])
- disassembleList :: Monad m => [Word8] -> m (Either ParseError [Instruction])
- disassembleArray :: (Monad m, IArray a Word8, Ix i) => a i Word8 -> m (Either ParseError [Instruction])
- showIntel :: Instruction -> [Char]
- showAtt :: Instruction -> [Char]
Types
data Operand :: *
All operands are in one of the following locations:
- Constants in the instruction stream
- Memory locations
- Registers
Memory locations are referred to by on of several addressing modes:
- Absolute (address in instruction stream)
- Register-indirect (address in register)
- Register-indirect with displacement
- Base-Index with scale
- Base-Index with scale and displacement
Displacements can be encoded as 8 or 32-bit immediates in the instruction stream, but are encoded as Int in instructions for simplicity.
OpImm Word32 | Immediate value |
OpAddr Word32 InstrOperandSize | Absolute address |
OpReg String Int | Register |
OpFPReg Int | Floating-point register |
OpInd String InstrOperandSize | Register-indirect |
OpIndDisp String Int InstrOperandSize | Register-indirect with displacement |
OpBaseIndex String String Int InstrOperandSize | Base plus scaled index |
OpIndexDisp String Int Int InstrOperandSize | Scaled index with displacement |
OpBaseIndexDisp String String Int Int InstrOperandSize | Base plus scaled index with displacement |
data InstrOperandSize :: *
Some opcodes can operate on data of several widths. This information is encoded in instructions using the following enumeration type..
data Instruction :: *
The disassembly routines return lists of the following datatype. It encodes both invalid byte sequences (with a useful error message, if possible), or a valid instruction. Both variants contain the list of opcode bytes from which the instruction was decoded and the address of the instruction.
BadInstruction Word8 String Int [Word8] | Invalid instruction |
PseudoInstruction Int String | Pseudo instruction, e.g. label |
Instruction | Valid instruction |
data ShowStyle :: *
Instructions can be displayed either in Intel or AT&T style (like in GNU tools).
Intel style:
- Destination operand comes first, source second.
- No register or immediate prefixes.
- Memory operands are annotated with operand size.
- Hexadecimal numbers are suffixed with
H
and prefixed with0
if necessary.
AT&T style:
- Source operand comes first, destination second.
- Register names are prefixes with
%
. - Immediates are prefixed with
$
. - Hexadecimal numbers are prefixes with
0x
- Opcodes are suffixed with operand size, when ambiguous otherwise.
IntelStyle | Show in Intel style |
AttStyle | Show in AT&T style |
Functions
disassembleBlock :: Ptr Word8 -> Int -> IO (Either ParseError [Instruction])
Disassemble a block of memory. Starting at the location pointed to by the given pointer, the given number of bytes are disassembled.
disassembleList :: Monad m => [Word8] -> m (Either ParseError [Instruction])
Disassemble the contents of the given list.
disassembleArray :: (Monad m, IArray a Word8, Ix i) => a i Word8 -> m (Either ParseError [Instruction])
Disassemble the contents of the given array.
showIntel :: Instruction -> [Char]
Show an instruction in Intel style.
showAtt :: Instruction -> [Char]
Show an instruction in AT&T style.