Skip to content

Instantly share code, notes, and snippets.

@sousk
Forked from 7shi/disasm.fsx
Created July 6, 2014 01:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sousk/1c50e287f4500975239a to your computer and use it in GitHub Desktop.
Save sousk/1c50e287f4500975239a to your computer and use it in GitHub Desktop.
let bin = System.IO.File.ReadAllBytes "../../test"
let mutable i = 0
let show len asm =
printf "%08X " i
for j = 0 to len - 1 do
printf "%02X" bin.[i + j]
for j = len to 5 do
printf " "
printfn "%s" asm
i <- i + len
let reg16 = [| "ax"; "cx"; "dx"; "bx"; "sp"; "bp"; "si"; "di" |]
let reg8 = [| "al"; "cl"; "dl"; "bl"; "ah"; "ch"; "dh"; "bh" |]
let sreg = [| "es"; "cs"; "ss"; "ds" |]
let regm = [| "bx+si"; "bx+di"; "bp+si"; "bp+di"
"si"; "di"; "bp"; "bx" |]
let dispstr d =
if d < 0 then
sprintf "-0x%x" (abs d)
else
sprintf "+0x%x" d
let modrm() =
let mode = int bin.[i+1] >>> 6
let rm = int bin.[i+1] &&& 0b111
match mode, rm with
| 0b00, 0b110 ->
2, sprintf "[0x%02x%02x]" bin.[i+3] bin.[i+2]
| 0b00, _ ->
0, sprintf "[%s]" regm.[rm]
| 0b01, _ ->
let d = bin.[i+2] |> sbyte
1, sprintf "[%s%s]" regm.[rm] (dispstr (int d))
| 0b10, _ ->
let d = (int16 bin.[i+2]) ||| ((int16 bin.[i+3]) <<< 8)
2, sprintf "[%s%s]" regm.[rm] (dispstr (int d))
| 0b11, _ ->
0, reg16.[rm]
| _ ->
0, "???"
while i < bin.Length do
match int bin.[i] with
| 0b10001101 ->
let reg = (int bin.[i+1] >>> 3) &&& 0b111
let len, opr = modrm()
show (2 + len) <| sprintf "lea %s, %s"
reg16.[reg] opr
| 0b10001110 ->
let reg = (int bin.[i+1] >>> 3) &&& 0b11
let len, opr = modrm()
show (2 + len) <| sprintf "mov %s, %s"
sreg.[reg] opr
| 0b10001100 ->
let reg = (int bin.[i+1] >>> 3) &&& 0b11
let len, opr = modrm()
show (2 + len) <| sprintf "mov %s, %s"
opr sreg.[reg]
| b when b &&& 0b11111000 = 0b10110000 ->
show 2 <| sprintf "mov %s, 0x%02x"
reg8.[b &&& 0b111] bin.[i+1]
| b when b &&& 0b11111000 = 0b10111000 ->
show 3 <| sprintf "mov %s, 0x%02x%02x"
reg16.[b &&& 0b111] bin.[i+2] bin.[i+1]
| _ ->
show 1 <| sprintf "db 0x%02x" bin.[i]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment