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

#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 в качестве загрузочного сектора. Смотрите мой ответ, который поможет вам пройти большую часть пути.