#assembly #emulation #bochs
#сборка #эмуляция #bochs
Вопрос:
Я хочу использовать Bochs в качестве эмулятора 8086. Есть ли простой способ сделать это? То, что я хочу, это что-то вроде emu8086 (http://www.emu8086.com /).
Ответ №1:
Если начальная часть вашей программы занимает 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 для этой цели. Его флаги отладки (см. manpage под -d
) достаточны для наблюдения за состоянием выполнения программы x86 на уровне сборки. (Я даже нашел это достаточно полезным для отладки ядер ОС, написанных на C, при условии, что вы очень внимательно посмотрите, что генерирует компилятор C.)
Комментарии:
1. Спасибо за ваш вклад. Я думаю, что emu8086 / DOS DEBUG лучше подойдет для моих целей.
2. вы можете загрузить его в qemu следующим образом:
qemu-system-x86_64 -hda floppy.img
3. что мне делать, если размер моей программы превышает 512 байт?
4. @JanusTroelsen — Тогда он не поместится в загрузочный сектор. Вам нужно написать что-то, что умещается в 512 байтах и способно загружать остальной ваш код из другого места на диске.
Ответ №2:
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
Ответ №3:
Это не то, что вы на самом деле хотите сделать. (Ну, может быть, это …)
По сути, Bochs — это эмулятор ПК x86. Чтобы выполнить машинный код на нем, вам нужно перенести машинный код на образ «диска». Образ диска — это файл, структура которого подобна дискете (дискете или жесткому диску).
КОМПЬЮТЕР имеет определенную последовательность загрузки, которая просматривает разделы диска, загружает туда машинный код и выполняет его. Вот как запускается операционная система.
Запуск «hello world» на ассемблере, честно говоря, будет немного затруднен, поскольку у вас не будет ничего, кроме BIOS, поскольку у вас не будет ОС для запуска поверх.
Итак, если вы хотите продолжить это, вам следует поискать книги и сайты по операционным системам для хобби и узнать, как работает процесс начальной загрузки и т.д. В противном случае работайте с чем-то вроде DOS-системы, создавайте COM-файлы и переходите оттуда.
Комментарии:
1. Спасибо. Я думал в том же направлении… Я попробую DOSBox.
2. На самом деле не сложно написать hello world в качестве загрузочного сектора. Смотрите мой ответ, который поможет вам пройти большую часть пути.