assembly BIOS不读取扇区

tvz2xvvm  于 2023-03-18  发布在  iOS
关注(0)|答案(1)|浏览(129)

解决方案:经过调查,我发现作为输入的驱动器是错误的。包含它的存储单元被另一个函数覆盖。对于将来遇到同样问题的任何人,请检查所有输入,即使它们看起来是正确的。我认为应该避免将值作为参数写入函数中的特定地址,因为如果函数被重新定位,值会丢失。
我写了一个16位的操作系统,目前在阅读盘,问题是BIOS函数ah = 2,int 0x 13产生进位标志,第二次读0段,错误的read ax设置为0x 2000后,所以0段被读取,它不告诉如果BIOS功能不支持或东西.我的图像/磁盘有2头和36扇区每个轨道(告诉我一个BIOS函数)。有没有办法修复这个?
如果需要,功能代码:

param_loadlba_sectors: db 1
param_loadlba: dw 0
param_loadlbabuffer: dw 0
load_with_lba:
    ;
    ;   Convert lba to chs
    ;
    pusha
    mov ax, [param_loadlba]
    div BYTE[self_sectperside]
    ; temp, sector = lba / sect per side, lba % sect per side + 1
    mov BYTE[LODAWITHLBATEMP], al
    inc ah
    mov BYTE[LOADWITLBASECTOR], ah

    mov ah, 0
    mov al, BYTE[LODAWITHLBATEMP]
    div BYTE[self_heads]
    ; cylinder, head = temp / heads, temp % heads
    mov BYTE[LOADWITHLBACYLINDER], al
    mov BYTE[LOADWITHLBAHEAD], ah
    ;
    ;   Load
    ;
    ; drive
    mov dl, [start_drive]
    ; cylinder
    mov cl, BYTE[LOADWITHLBACYLINDER]
    ; diskside
    mov dh, BYTE[LOADWITHLBAHEAD]
    ; sector
    mov cl, [LOADWITLBASECTOR]
    ; number of sectors
    mov al, BYTE[param_loadlba_sectors]
    ; es = 0
    mov bx, 0
    mov es, bx
    ; bx = *param_loadlbabuffer
    mov bx, WORD[param_loadlbabuffer]
    mov ah, 0x2
    clc
    int 0x13
    ; check if error
    jnc NOERROR
    mov BYTE[error], FILEERROR
    NOERROR:
    mov BYTE[param_loadlba_sectors], 1
    popa
    ret
LODAWITHLBATEMP: db 0
LOADWITLBASECTOR: db 0
LOADWITHLBAHEAD: db 0
LOADWITHLBACYLINDER: db 0

在错误调用后,我检查了“局部变量”的状态,它计算出柱面0,磁头0和扇区4被读取(底部的标签)。
如果这很重要,我会在第一次调用时加载一些代码到地址0x 500并跳转到它(我验证了代码在那里被执行),即使我在跳转前第二次读取函数调用,它也会引发进位标志。
我使用qemu和nasm。

jbose2ul

jbose2ul1#

程序在其他地方删除了起始寄存器标签中的值。所以它试图在不存在的驱动器上读取,因此失败。

相关问题