【发布时间】:2017-05-07 14:07:17
【问题描述】:
我正在使用带有扩展驱动器功能0x42 的中断0x13 在实模式下从扩展驱动器读取扇区。
我在以下结构中将 DAP 定义为 16 个字节:
DAP:
db 0x10 ; size of DAP
db 0 ; Reserved zero
dw 0x0001 ; Number of sectors to read
dd 0x00000200 ; Memory Location to load the sector (s)
dq 0 ; Start of the sectors to be read
如您所见,DAP 段的长度为 8 字节。在寻找我的扇区(循环扇区)期间,我增加了该段并将其与我的驱动器的实际大小进行比较。我用来递增的错误代码仅限于 16 位模式:
mov ax, [DAP+0x08]
inc ax
mov [DAP+0x08], ax
我不想在复杂的寻址模式下使用几个通用寄存器来达到我的目的,我想你有一些简单有效的方法。
【问题讨论】:
-
段不是 8 字节(64 位值)。您列出的 8 字节值是 LBA(逻辑块地址)。段。实际上是您列为
offset的内容的第二个2 个字节。您列为offset的四个字节值实际上是实模式段:偏移量对。 -
@MichaelPetch,您对我的代码 cmets 是正确的。这是由于从某个地方复制部分代码的错误。反正我修改了代码cmets。
-
4 字节值 0x200 实际上与 0x00000200 相同,转换为 0x0000:0x0200 的段偏移对。我希望这不是您开始读取扇区的内存位置,因为它恰好位于从 0x0000 到 0x3fff 的较低内存中的中断向量表的顶部。之后是从 0x400 到 0x4ff 的 BIOS 数据区。在古老的硬件上,有从 0x500 开始的保留字节。我建议开始阅读 0x0000:0x0600
-
为了便于阅读,我会将
dd 0x00000200拆分为两个单独的 16 位字。并将其设置为dw 0x0000 ; offset后跟dw 0x07e0 ; segment表示 0x07e0:0x0000 是物理地址 (0x07e0 -
读错内存地址可不是小问题。这是一个错误。
标签: assembly x86 nasm real-mode fat16