(сборка в реальном режиме 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).

Другие вопросы по тегам