Как увеличить эффективный адрес 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

Я не хочу использовать несколько регистров общего назначения в режиме сложной адресации для достижения моей цели, я думаю, у вас есть простой и эффективный способ.

1 ответ

Решение

Чтобы увеличить 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 потому что первый не устанавливает флаг переноса.

Другие вопросы по тегам