如何在实模式下递增 64 位内存有效地址

How to increment 64-bit memory effective address in Real Mode

我正在使用具有扩展驱动器 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

我不想通过复杂的寻址方式使用多个通用寄存器来达到我的目的,我想你有一些简单有效的方法。

要递增 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 位 add/adc:

ADD DWORD [DAP+ 8], 1
ADC DWORD [DAP+12], 0

注意不能用INC WORD [DAP+ 8]代替ADD WORD [DAP+ 8], 1因为前者没有设置进位标志