Как сказать процессору «выполни это»?
Превратить это в бинарник для начала и посмотреть, что там. Это можно (было бы) сделать командой
xxd -r dump
, но в твоём дампе странный порядок байтов в словах. Можно сначала перевернуть байты, а потом прогнать через xxd:
sed 's/\([^ ]*\)/\1/;s/ \(..\)\(..\)/ \2\1/g' < dump | xxd -r > bin
. Прогнав полученный код через дизассемблер можно понять (по переходу к адресу 0x7c05), что это код для бут-сектора:
$ objdump -b binary -m i8086 -D bin
bin1: file format binary
Disassembly of section .data:
00000000 <.data>:
0: ea 05 7c 00 00 ljmp $0x0,$0x7c05
5: 31 c0 xor %ax,%ax
...
Дальше можно записать этот код в образ диска и попытаться загрузиться с него:
$ head -c 254 /dev/zero >> bin
$ printf "\x55\xaa" >> bin
$ qemu-system-i386 -hda bin -d in_asm,exec -D log
Поискав в созданном логе адрес 7c00 можно увидеть, что код делает при выполнении:
----------------
IN:
0x00007c00: ea 05 7c 00 00 ljmpw $0x0:$0x7c05
Trace 0: 0x7f7a98164f00 [00000000/00007c00/0x40]
----------------
IN:
0x00007c05: 31 c0 xorw %ax, %ax
0x00007c07: 8e d8 movw %ax, %ds
0x00007c09: 8e d0 movw %ax, %ss
Trace 0: 0x7f7a98165040 [00000000/00007c05/0x40]
----------------
IN:
0x00007c0b: bc 00 7c movw $0x7c00, %sp
Trace 0: 0x7f7a98165180 [00000000/00007c0b/0x48]
----------------
IN:
0x00007c0e: 88 16 db 7c movb %dl, 0x7cdb
0x00007c12: 31 c0 xorw %ax, %ax
0x00007c14: 8e c0 movw %ax, %es
0x00007c16: bb 00 80 movw $0x8000, %bx
0x00007c19: 8a 16 db 7c movb 0x7cdb, %dl
0x00007c1d: b6 00 movb $0, %dh
0x00007c1f: b1 02 movb $2, %cl
0x00007c21: b5 00 movb $0, %ch
0x00007c23: b0 30 movb $0x30, %al
0x00007c25: e8 53 00 callw 0x7c7b
Trace 0: 0x7f7a98165280 [00000000/00007c0e/0x40]
----------------
IN:
0x00007c7b: b4 02 movb $2, %ah
0x00007c7d: cd 13 int $0x13
-- он
хочет загрузить 48 секторов начиная со второго с текущего диска в память по адресу 0x8000, потом делает какую-то скучную фигню, а потом…
----------------
IN:
0x00007c2f: fa cli
0x00007c30: 0f 01 16 f4 7c lgdtw 0x7cf4
0x00007c35: 0f 20 c0 movl %cr0, %eax
0x00007c38: 66 83 c8 01 orl $1, %eax
0x00007c3c: 0f 22 c0 movl %eax, %cr0
Linking TBs 0x7f7a98167580 [00007c2b] index 0 -> 0x7f7a981676c0 [00007c2f]
Trace 0: 0x7f7a981676c0 [00000000/00007c2f/0x40]
----------------
IN:
0x00007c3f: ea 44 7c 08 00 ljmpw $0x8:$0x7c44
Trace 0: 0x7f7a981678c0 [00000000/00007c3f/0xc0]
----------------
IN:
0x00007c44: 66 b8 10 00 movw $0x10, %ax
0x00007c48: 8e d8 movl %eax, %ds
Trace 0: 0x7f7a98167a00 [00000000/00007c44/0x90]
----------------
IN:
0x00007c4a: 8e c0 movl %eax, %es
Trace 0: 0x7f7a98167b40 [00000000/00007c4a/0x90]
----------------
IN:
0x00007c4c: 8e e0 movl %eax, %fs
0x00007c4e: 8e e8 movl %eax, %gs
0x00007c50: 8e d0 movl %eax, %ss
Trace 0: 0x7f7a98167c80 [00000000/00007c4c/0x90]
----------------
IN:
0x00007c52: bc 00 c0 07 00 movl $0x7c000, %esp
Trace 0: 0x7f7a98167dc0 [00000000/00007c52/0xb8]
----------------
IN:
0x00007c57: e8 a4 03 00 00 calll 0x8000
…переключается в защищённый режим и вызывает только что загруженный код.
как например запихнуть это в exe файл?
в exe-файл это запихнуть можно, но в таком виде как есть -- это бесполезно, потому что этот код привязан к абсолютным адресам.