Как я могу использовать Bochs для запуска ассемблерного кода? - PullRequest
7 голосов
/ 26 мая 2011

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

Ответы [ 3 ]

8 голосов
/ 26 мая 2011

Если начальная часть вашей программы умещается в 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).

5 голосов
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#L33

1 голос
/ 26 мая 2011

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

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

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

Честно говоря, запуск "hello world" в сборке будет немного затруднен, так как у вас не будет ничего, кроме BIOS, поскольку у вас не будет операционной системы, работающей поверх.

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

...