如何在实模式下递增 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,您可以使用 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 位 add/adc:
ADD DWORD [DAP+ 8], 1
ADC DWORD [DAP+12], 0
注意不能用INC WORD [DAP+ 8]
代替ADD WORD [DAP+ 8], 1
因为前者没有设置进位标志
我正在使用具有扩展驱动器 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,您可以使用 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 位 add/adc:
ADD DWORD [DAP+ 8], 1
ADC DWORD [DAP+12], 0
注意不能用INC WORD [DAP+ 8]
代替ADD WORD [DAP+ 8], 1
因为前者没有设置进位标志