-
-
Save sousk/1c50e287f4500975239a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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