(程序集x86实模式)程序结束时数据“中断”了吗?

jth*_*jth 3 x86 assembly operating-system real-mode nasm

这是(nasm x86实模式)的后续工作,如何在引导加载的扇区中写入/读取字符串?

我正在为NASM中的x86实模式开发玩具OS。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
Run Code Online (Sandbox Code Playgroud)

这是源文件的末尾,我在其中存储数据。有一个键盘映射,可根据Dvorak键盘布局转换输入。但是该程序似乎在之后被“切断” 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
Run Code Online (Sandbox Code Playgroud)

所以,当你启动操作系统,可以键入键a- u在德沃夏克但不v- z。此外,printdvorak_keymap字符串上调用程序的功能可确认字符串在之后终止fu

但更重要的是,这表明我的程序空间不足,因此无法添加更多数据或代码。我不能达到1 MB的内存限制,因为源文件只有282 sloc。

我猜测这与我如何加载扇区有关?我是汇编语言和低级编程的新手,因此非常感谢您的帮助。

来源:https : //github.com/jtherrmann/os/blob/master/os.asm

原始的:https : //raw.githubusercontent.com/jtherrmann/os/master/os.asm

编辑:此外,当我在文件中更高的位置添加更多的数据/代码时,键映射会更早地被切断,而当我移除更高的数据/编码时,则键映射将稍后或根本不被断开。因此,我知道这与空间限制有关。

Bre*_*dan 5

您的代码有多个错误。

a)它不会在已知位置建立堆栈,然后从磁盘加载数据的地址可能会覆盖堆栈(可能在同一地址)。

b)假定在不检查BIOS是否返回错误的情况下从磁盘加载数据的工作正常。

c)它仅加载一个扇区,而无法确定实际大小和“自我调整”;因此随着文件的增长,它将是一个持续的维护工作。这可能是您的数据“中断”的原因(前512个字节未加载后的所有内容)

d)在定义“ newstart”之前使用它,然后为时已晚,然后定义“ newstart equa 0x0500”。

e)您假定所有字符都是可打印的。它们不是(光标移动,功能键...)

还要注意,将字符从QWERTY转换为Dvorak的代码效率极低(遍历所有条目以查找正确的字符,而不是将原始字符用作表的索引,例如movzx eax,almov al,[table+eax]);并且当前在很多情况下都无法使用(例如,如果用户按下“ shift + a”或启用了大写锁定)。

  • 对于D部分,NASM是一个多通道汇编器,可以解析EQU的正向引用。我同意这有点不合常规,但应该可以。 (2认同)