(сборка в реальном режиме x86) Данные "обрезаются" в конце программы?
Это продолжение (реальный режим nasm x86). Как писать / читать строки в загрузочном секторе?,
Я работаю над игрушечной ОС для реального режима x86 в NASM. Загрузочный сектор 512B загружает другой сектор с остальной частью кода. Проблема в том, что мне кажется, что в конце программы не хватает места.
Вот начало исходного файла:
;;; nasm -f bin -o boot.bin os.asm
;;; qemu-system-x86_64 boot.bin
bits 16
section boot, vstart=0x0000
;; 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, newsector
mov es, bx
xor bx, bx
int 0x13
jmp newsector:0
newsector equ 0x0500
times 510-($-$$) db 0
db 0x55
db 0xaa
section os, vstart=0x0000
mov ax, newsector
mov ds, ax
И вот конец исходного файла, где я храню данные. Есть раскладка клавиш для преобразования ввода в соответствии с раскладкой клавиатуры Дворака. Но программа, похоже, "обрезается" после fu
,
input times 16 db 0
repl_prompt times 16 db 0
dvorak db 1
dvorak_keymap:
db "aa"
db "nb"
db "ic"
db "hd"
db "de"
db "yf"
db "ug"
db "jh"
db "gi"
db "cj"
db "vk"
db "pl"
db "mm"
db "ln"
db "so"
db "rp"
db "xq"
db "or"
db ";s"
db "kt"
db "fu"
db ".v" ; FIXME: gets cut off here
db ",w"
db "bx"
db "ty"
db "/z"
db 0
Поэтому, когда вы загружаете ОС, вы можете ввести ключи a
-u
в Дворак но не v
-z
, Кроме того, вызывая программу print
функция на dvorak_keymap
строка подтверждает, что строка заканчивается после fu
,
Но что еще более важно, это означает, что в моей программе не хватает места, поэтому я не могу добавить больше данных или кода. Я не могу достичь лимита памяти в 1 МБ, потому что исходный файл - только 282 sloc.
Я предполагаю, что это как-то связано с тем, как я загружаю сектора? Я новичок в сборке и низкоуровневом программировании, поэтому любая помощь будет принята с благодарностью.
источник: https://github.com/jtherrmann/os/blob/master/os.asm
raw: https://raw.githubusercontent.com/jtherrmann/os/master/os.asm
Редактировать: Кроме того, когда я добавляю больше данных / кода выше в файл, раскладка клавиатуры обрезается раньше, а когда я удаляю данные / код более высокого уровня, раскладка клавиатуры отключается позже или не выполняется вовсе. Так что я знаю, что это как-то связано с ограниченностью пространства.
1 ответ
Ваш код содержит несколько ошибок.
a) Он не устанавливает стек в известном месте, а затем загружает данные с диска по адресу, который может перезаписать стек (который может быть по тому же адресу).
б) Предполагается, что загрузка данных с диска работала без проверки, вернул ли BIOS ошибку.
в) загружается только один сектор без какого-либо способа определения фактического размера и "самонастройки"; так как файл растет, это будет непрерывная работа по обслуживанию. Вероятно, это является причиной того, что ваши данные "обрезаются" (все после первых 512 байтов не загружается)
d) Вы используете "newstart" до того, как он был определен, а затем определяете "newstart equa 0x0500" после того, как будет слишком поздно.
д) Вы предполагаете, что все символы пригодны для печати. Они не (движение курсора, функциональные клавиши,...)
Также обратите внимание, что ваш код для преобразования символа из QWERTY в Dvorak невероятно неэффективен (просматривая все записи, чтобы найти правильный, вместо использования исходного символа в качестве индекса в таблице - например, как movzx eax,al
, mov al,[table+eax]
); и в настоящее время он не будет работать во многих случаях (например, если пользователь нажимает "shift+a" или если у него включен capslock).