Я пробую новый подход к int 0x13 (просто чтобы узнать больше о том, как работает система): использование стека для создания DAP ..
Предполагая, что DL содержит номер диска, AX содержит адрес загрузочной записи в PT, DS обновляется до правого сегмента и стек задан правильно, это код:
push DWORD 0x00000000
add ax, 0x0008
mov si, ax
push DWORD [ds:(si)]
push DWORD 0x00007c00
push WORD 0x0001
push WORD 0x0010
push ss
pop ds
mov si, sp
mov sp, bp
mov ah, 0x42
int 0x13
Как вы можете видеть: я помещаю структуру dap в стек, обновляю DS: SI, чтобы указать на нее, DL уже установлен, затем устанавливаю AX в 0x42 и вызываю int 0x13
результатом является ошибка 0x01 в AH и, очевидно, установлен CF. Секторы не передаются.
Я бесконечно проверил трассировку стека и все в порядке, таблица разделов тоже в порядке .. Я не могу понять, что мне не хватает ...
Это часть трассировки стека пакета адреса диска:
0x000079ea: 10 00 adc %al,(%bx,%si)
0x000079ec: 01 00 add %ax,(%bx,%si)
0x000079ee: 00 7c 00 add %bh,0x0(%si)
0x000079f1: 00 00 add %al,(%bx,%si)
0x000079f3: 08 00 or %al,(%bx,%si)
0x000079f5: 00 00 add %al,(%bx,%si)
0x000079f7: 00 00 add %al,(%bx,%si)
0x000079f9: 00 a0 07 be add %ah,-0x41f9(%bx,%si)
Я использую последнюю версию qemu и пытаюсь читать с жесткого диска (0x80), также пытался с выравниванием 4 байт для структуры с тем же результатом (CF 1 AH 0x01), расширения присутствуют.