如何在实模式

问题描述:

递增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 

我不想使用几种通用寄存器在复杂的寻址模式来实现我的目的,我想你有一些简单而有效的方式。

+0

段不是8字节(64位值)。您列出的8字节值是LBA(逻辑块地址)。细分市场。实际上是你列为'offset'的第二个2字节。您列为'offset'的四个字节值实际上是一个实模式片段:偏移量对。 –

+0

@MichaelPetch,你对我的代码评论是正确的。这是由于从某处复制部分代码的错误所致。无论如何,我修改了代码评论。 –

+0

4字节值在0x200实际上是相同的0x00000200其转换为一个段偏移对0×0000:0200。我希望这不是你开始读扇区的内存中的地方,因为它恰好位于运行从0x0000到0x3fff的较低内存中的中断向量表之上。之后是从0x400到0x4ff的BIOS数据区。在古代硬件上,保留字节从0x500开始。我建议开始读取0x0000:0x0600 –

要增加一个64位QWORD,您可以使用addadc说明:

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,因为前者不会设置进位标志。

+0

谢谢@FUZ。我正在使用NASM,他们现在不适合我,我会回来的。 –

+3

@fuz:或者如果你有一个('FILD qword [DAP + 8]/FLD1/FADDP/FISTP qword [DAP + 8]'),你可以直接路由并滥用FPU。无可否认,但x87具有足够的精度和正确的溢出语义来做正确的事情。 – doynax

+0

@doynax事实上,这可行,但它可能会更糟。 – fuz