如何在实模式
问题描述:
递增64位内存有效地址我使用的中断0x13
与扩展驱动器0x42
的功能读取从我的扩展驱动器部门在实模式。如何在实模式
我定义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
我不想使用几种通用寄存器在复杂的寻址模式来实现我的目的,我想你有一些简单而有效的方式。
答
要增加一个64位QWORD,您可以使用add
和adc
说明:
ADD WORD [DAP+ 8], 1
ADC WORD [DAP+10], 0
ADC WORD [DAP+12], 0
ADC WORD [DAP+14], 0
或者,如果你的目标不是8088,8086,或80286,您还可以使用32位加/ ADC:
ADD DWORD [DAP+ 8], 1
ADC DWORD [DAP+12], 0
请注意,您不能使用INC WORD [DAP+ 8]
代替ADD WORD [DAP+ 8], 1
,因为前者不会设置进位标志。
段不是8字节(64位值)。您列出的8字节值是LBA(逻辑块地址)。细分市场。实际上是你列为'offset'的第二个2字节。您列为'offset'的四个字节值实际上是一个实模式片段:偏移量对。 –
@MichaelPetch,你对我的代码评论是正确的。这是由于从某处复制部分代码的错误所致。无论如何,我修改了代码评论。 –
4字节值在0x200实际上是相同的0x00000200其转换为一个段偏移对0×0000:0200。我希望这不是你开始读扇区的内存中的地方,因为它恰好位于运行从0x0000到0x3fff的较低内存中的中断向量表之上。之后是从0x400到0x4ff的BIOS数据区。在古代硬件上,保留字节从0x500开始。我建议开始读取0x0000:0x0600 –