解决方案:经过调查,我发现作为输入的驱动器是错误的。包含它的存储单元被另一个函数覆盖。对于将来遇到同样问题的任何人,请检查所有输入,即使它们看起来是正确的。我认为应该避免将值作为参数写入函数中的特定地址,因为如果函数被重新定位,值会丢失。
我写了一个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。
1条答案
按热度按时间jbose2ul1#
程序在其他地方删除了起始寄存器标签中的值。所以它试图在不存在的驱动器上读取,因此失败。