Я использую NASM для написания минимальной ОС для реального режима x86 в образовательных целях. Я хочу использовать 512-байтовый загрузочный сектор для загрузки большего сектора, содержащего остальную часть ОС. Я успешно создал загрузочный сектор, который загружает другой сектор, но я не могу записывать/читать строки в загруженном секторе. Вот мой код:
bits 16
mov ax, 0x7c0
mov ds, ax
jmp code
;; Write bootStr to boot sector.
bootStr db "AAA"
code:
;; for int 0x10
mov ah, 0x0e
;; Print first char of bootStr.
mov di, bootStr
mov BYTE al, [di]
int 0x10 ; prints A
;; Load next sector.
;; adapted from:
;; https://blog.benjojo.co.uk/post/interactive-x86-bootloader-tutorial
mov ah, 0x02
mov al, 1
mov ch, 0
mov cl, 2
mov dh, 0
mov bx, new
mov es, bx
xor bx, bx
int 0x13
jmp new:0
new equ 0x0500
;; Pad boot sector.
times 510-($-$$) db 0
db 0x55
db 0xaa
nextSector:
;; for int 0x10
mov ah, 0x0e
;; Try to print first char of nextStr (defined below).
mov di, nextStr
mov BYTE al, [di]
int 0x10 ; should print B
;; Move 'C' into nextStr and print it.
mov BYTE [di], 'C'
mov BYTE al, [di]
int 0x10 ; prints C
;; Print first char of bootStr again.
mov di, bootStr
mov BYTE al, [di]
int 0x10 ; prints A
hlt
nextStr db "BBB"
Когда я запускаю (в Debian Stretch):
nasm -f bin -o boot.bin boot.asm
qemu-system-x86_64 boot.bin
Я получил:
Booting from Hard Disk...
A CA
Итак, похоже, что какой-то невидимый символ печатается там, где я ожидаю увидеть B
.
Чего я не понимаю, так это почему из загруженного сектора я могу записать символы в nextStr
с помощью mov BYTE [di] 'C'
, а затем распечатать их, но я не могу определить nextStr
с помощью db
, а затем распечатать его символы. Через несколько часов мне не удалось решить проблему.
Вопросы:
- Во-первых,
nextStr
никогда не пишется сdb
, или я просто не могу его прочитать/напечатать? - Как мне это исправить, чтобы я мог писать/читать/печатать строки в загруженном секторе?
org
и 0 используется по умолчанию). Это означает, что все метки, начинающиеся сnextSector
, начинаются не со смещения 0x000, как ожидает ваш код, а со смещения 512. - person Michael Petch   schedule 23.09.2018org
(точка начала) была равна 0 в каждом файле. Если вам нужно все в одном файле, вы можете просмотреть разделы сvstart
адресом 0. Вы можете прочитать об этом в документы NASM в разделе 7.1.3 Поддержка многосекционного формата для формата bin - person Michael Petch   schedule 23.09.2018new
(или 0x500), чтобы вы читали из нужного сегмента памяти, где код в nextSector был физически загружен. - person Michael Petch   schedule 23.09.2018dd
для сборки двух частей в один двоичный файл. Вы должны быть в состоянии найти некоторые с помощью поиска. Однако единственная проблема заключается в том, что если вы разделите их, вы не сможете легко сослаться на переменнуюbootStr
в первом файле со вторым. - person Michael Petch   schedule 23.09.2018boot.asm
для своего реального проекта, и он отлично работает! Большое спасибо! - person jth   schedule 23.09.2018