Как я могу использовать Bochs для запуска ассемблерного кода?

Я хочу использовать Bochs в качестве эмулятора 8086. Есть простой способ сделать это? Я хочу что-то вроде emu8086 ( http://www.emu8086.com/).

3 ответа

Если начальная часть вашей программы умещается в 512 байт, и вы не против ограничиться вызовами BIOS, in/out инструкции и запись в магические места памяти для ввода / вывода... Тогда да!

Предполагая, что вы используете NASM, вот глупый пример... (Внимание: мои навыки работы с 16-битной сборкой не очень хороши и немного ржавые, так что это может быть не самый лучший код.)

[org 7c00h]              ; BIOS will load us to this address

mov ax, 0b800h           ; Console memory is at 0xb8000; set up a segment
mov es, ax               ; for the start of the console text.

;
; Let's clear the screen....
;

xor di, di               ; Start at beginning of screen
mov cx, 80*25            ; Number of chars in the screen
mov al, ' '              ; Space character
mov ah, 0fh              ; Color (white on black)
repne stosw              ; Copy!

;
; Write an 'a' to the screen...
;

mov byte [es:0], 'a'     ; Write an 'a'

sleep:
hlt                      ; Halts CPU until the next external interrupt is fired
jmp sleep                ; Loop forever

times 510-($-$$) db 0    ; Pad to 510 bytes
dw 0aa55h                ; Add boot magic word to mark us as bootable

Тогда вы можете собрать с:

nasm foo.asm

И запишите это на образ дискеты следующим образом: (Предполагая систему типа Unix...)

$ dd if=/dev/zero of=floppy.img bs=512 count=2880
$ dd if=foo of=floppy.img conv=notrunc

Теперь вы можете загрузить этот образ дискеты в Bochs (или, если вы запишите его на дискету, запустить его на реальном ПК), и он должен написать "a" на экране.

Обратите внимание, что это обычно полезно, только если вы пишете загрузчик или операционную систему... Но с экспериментом весело, особенно если вы учитесь.

Обновление: я прочитал веб-сайт emu8086... Кажется, что-то вроде встроенного использования x86, а не ПК. Похоже, у него есть некоторые интересные функции для моделирования оборудования. Если вы не заинтересованы в ориентации на ПК, Bochs не будет интересен. Если это не то, что вы хотите сделать, я согласен с комментатором, который предложил использовать сам emu8086.

Если вы заинтересованы в компьютерах, но хотите что-то пройти через ваши программы... Я часто использовал qemu для этой цели. Его отладочные флаги (см. Man-страницу под -d) достаточно для наблюдения за состоянием выполнения программы x86 на уровне сборки. (Я даже нашел его достаточно полезным для отладки ядер ОС, написанных на C, при условии, что вы очень внимательно посмотрите, что генерирует компилятор C).

sudo apt-get install bochs bochs-sdl

printf 'ata0-master: type=disk, path="main.img", mode=flat, cylinders=1, heads=1, spt=1
boot: disk
display_library: sdl
megs: 128
' > .bochsrc

bochs -q

у меня работал на Ubuntu 14.04, Bochs 2.4.6 с загрузочным сектором длиной 512 байт main.img,

  • cylinders=1, heads=1, spt=1 указывает размер диска и должен соответствовать вашему образу! Здесь мы устанавливаем все, чтобы 1 означать 1 цилиндр, который составляет 512 байт, как наш файл изображения.
  • display_library: sdl может понадобиться из-за ошибки упаковки Ubuntu

main.img был сгенерирован из main.asm:

org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$$) db 0
dw 0xaa55

Затем:

nasm -f bin -o main.img main.asm

Это изображение использует BIOS для печати одного символа a на экран.

Можно избежать создания .bochsrc файл с помощью следующей командной строки:

bochs \
    -qf /dev/null \
    'ata0-master: type=disk, path="main.img", mode=flat, cylinders=1, heads=1, spt=1' \
    'boot: disk' \
    'display_library: sdl' \
    'megs: 128'

-qf /dev/null часть уродлива, но это единственный способ, которым мне удалось автоматически пропустить экран меню:

  • -q или же -n всегда просить об этом, и я должен ударить 6 чтобы потом бежать
  • -qn <(echo ...) также работает, но использует расширение Bash, которое не работает на моем Makefile

С интерфейсом QEMU было легче начать, поэтому я рекомендую использовать его вместо этого.

Репозиторий GitHub с этим примером: https://github.com/cirosantilli/x86-bare-metal-examples/blob/cba0757990843f412b14dffad45467ad0034d286/Makefile

Это не то, что вы действительно хотите сделать. (Ну может это так...)

По сути, Bochs - это эмулятор ПК для x86. Для того, чтобы выполнить машинный код на этом, вам нужно получить машинный код на образе диска. Образ диска - это файл, который структурирован как диск (дискета или жесткий диск).

У ПК есть определенная последовательность загрузки, которая просматривает разделы диска, загружает туда машинный код и выполняет его. Так запускается ОС.

Откровенно говоря, запуск "Hello World" в сборке будет немного сложным, так как у вас не будет ничего, кроме BIOS, поскольку у вас не будет операционной системы, на которой вы сможете работать.

Итак, если вы хотите продолжить это, вам нужно будет выследить книги и сайты по хобби операционным системам и узнать, как работает процесс начальной загрузки и т. Д. В противном случае, работать с чем-то вроде системы DOS, создавать файлы COM и переходить из там.

Другие вопросы по тегам