ASM - 文件长度和加载到RAM

时间:2014-01-04 22:13:35

标签: assembly kernel nasm ram

我有VBR保护模式开关和Vesa初始化。但是我在另一种情况下看到了这个问题。当内核有3个扇区时,将它加载到内存并跳转到0x7E00是没有问题的。但是当内核有4个或更多扇区时,它的代码就会停止工作......当我删除长内核的一些特性时,将内核的截断长度分成3个扇区 - 代码开始工作。

    mov dl, 0x80            ; 80 - FF => HardDisk
    mov ah, 0x42
    mov si, .kernelStruct
    int 0x13

...

.kernelStruct:

    dw 16               ; byte of structure length + empty byte
    dw sectorsForLoad       ; sectors for load count
    dd Kernel               ; out address
    dq 1                    ; start sector

...

times 510-($-$$) db 0
dw 0xAA55

; kernel code from 0x7E00

times 512 - (($-$$) % 512) db 0
sectorsForLoad equ ($-$$-512) / 512

为什么以及我该怎么办?谢谢。

1 个答案:

答案 0 :(得分:0)

两件事:

  • 堆栈(SS:SP)位于何处?也许你在从硬盘读取时覆盖堆栈!如果堆栈位于0000:8500,例如情况就是如此。
  • 我看到BIOS要求ES与控制结构中给出的地址具有相同的值,因此ES必须等于[DS:SI + 6]中的单词