| Copyright | (c) Martin Grabmueller and Dirk Kleeblatt | 
|---|---|
| License | BSD3 | 
| Maintainer | martin@grabmueller.de | 
| Stability | provisional | 
| Portability | portable | 
| Safe Haskell | None | 
| Language | Haskell98 | 
Harpy.X86Disassembler
Description
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.
Constructors
| 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..
Constructors
| OPNONE | No operand size specified  | 
| OP8 | 8-bit integer operand  | 
| OP16 | 16-bit integer operand  | 
| OP32 | 32-bit integer operand  | 
| OP64 | 64-bit integer operand  | 
| OP128 | 128-bit integer operand  | 
| OPF32 | 32-bit floating point operand  | 
| OPF64 | 64-bit floating point operand  | 
| OPF80 | 80-bit floating point operand  | 
Instances
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.
Constructors
| BadInstruction Word8 String Int [Word8] | Invalid instruction  | 
| PseudoInstruction Int String | Pseudo instruction, e.g. label  | 
| Instruction | Valid instruction  | 
Instances
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 
Hand prefixed with0if 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.
 
Constructors
| 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.