by shigemk2

当面は技術的なことしか書かない

小さなバイナリを使って分析 #ikebin

7shi / ikebin / wiki / 8086 / hello — Bitbucket

全然わからず自力ではできなかったのでコメントだけ書いてみる。

8086のアセンブリのソース

write.s

! write(1, hello, 6);
mov ax, #1
int 7
.data1 4
.data2 hello, 6

! exit(0);
mov ax, #0
int 7
.data1 1

.sect .data
hello: .ascii "hello\n"
$ 7run -d a.out
0000: b80100        mov ax, 0001
0003: cd07          int 7
0005: 04            ; sys write
0006: 1000          ; arg
0008: 0600          ; arg
000a: b80000        mov ax, 0000
000d: cd07          int 7
000f: 01            ; sys exit
$ hexdump -C a.out
00000000  eb 0e 10 00 06 00 00 00  00 00 00 00 00 00 01 00  |................|
00000010  b8 01 00 cd 07 04 10 00  06 00 b8 00 00 cd 07 01  |................|
00000020  68 65 6c 6c 6f 0a                                 |hello.|
00000026

バイナリダンプするプログラム

let aout = System.IO.File.ReadAllBytes "a.out"

// 0x10=16おきにループを始める。
// 16なのはhexdumpの仕様
for i in 0x10 .. 0x10 .. aout.Length - 1 do
    printf "%08x " i
    // 左側のダンプ部分
    for j in 0 .. 0xf do
        if i + j < aout.Length then
            printf "%02x " aout.[i + j]
        else
            printf "   "
    // 右側の文字出力部分
    for j in 0 .. 0xf do
        if i + j < aout.Length then
            let ch = int aout.[i + j]
            // 32-63だったら文字
            if 0x20 <= ch && ch <= 0x7e then
                printf "%c" (char ch)
            else
                printf "."
    printfn ""
$ fsharpi 1-1.fsx
00000000 eb 0e 10 00 06 00 00 00 00 00 00 00 00 00 01 00 ................
00000010 b8 01 00 cd 07 04 10 00 06 00 b8 00 00 cd 07 01 ................
00000020 68 65 6c 6c 6f 0a                               hello.