(сборка реального режима x86) Данные "обрезаются" в конце программы? - PullRequest
0 голосов
/ 23 сентября 2018

Это продолжение от (реальный режим 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 в Dvorak, но не v -z.Кроме того, вызов функции программы print для строки dvorak_keymap подтверждает, что строка заканчивается после fu.

Но, что более важно, это означает, что в моей программе закончилось свободное место, поэтому яне могу добавить больше данных или кода.Я не могу достичь предела памяти в 1 МБ, потому что исходный файл имеет размер только 282.

Я предполагаю, что это как-то связано с тем, как я загружаю сектора?Я новичок в сборке и низкоуровневом программировании, поэтому любая помощь будет принята с благодарностью.

source: https://github.com/jtherrmann/os/blob/master/os.asm

raw: https://raw.githubusercontent.com/jtherrmann/os/master/os.asm

Редактировать: Кроме того, когда я добавляю больше данных / кода выше в файл, раскладка клавиатуры обрезается раньше, а когда я удаляю данные / код более высокого уровня, раскладка клавиатуры отключается позже или не выполняется вовсе.Так что я знаю, что это как-то связано с ограниченным пространством.

1 Ответ

0 голосов
/ 23 сентября 2018

Ваш код содержит несколько ошибок.

a) Он не устанавливает стек в известном месте, а затем загружает данные с диска по адресу, который может перезаписать стек (который может быть натот же адрес).

b) Предполагается, что загрузка данных с диска работала без проверки, выдал ли BIOS ошибку.

c) Загрузка только одного сектора без какого-либо способа определения фактического размераи «саморегулироваться»;так как файл растет, это будет постоянная работа по обслуживанию.Вероятно, это является причиной того, что ваши данные «обрезаются» (все, что не загружено после первых 512 байт)

d) Вы используете «newstart» до того, как оно было определено, а затем определяете «newstart equa»0x0500 "после того, как будет слишком поздно.

e) Вы предполагаете, что все символы пригодны для печати.Они не являются (движение курсора, функциональные клавиши, ...)

Также обратите внимание, что ваш код для преобразования символа из QWERTY в Дворжак невероятно неэффективен (просматривая все записи, чтобы найти нужный вместо использованияисходный символ в качестве указателя на таблицу - например, movzx eax,al, mov al,[table+eax]);и в настоящее время он не будет работать во многих случаях (например, если пользователь нажимает «shift + a» или если у него включен capslock).

...