Проблема со стековой реализацией функции 0x42 из int 0x13 - PullRequest
2 голосов
/ 18 июня 2010

Я пробую новый подход к 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), расширения присутствуют.

Ответы [ 2 ]

2 голосов
/ 19 июня 2010

Что делает mov sp, bp - куда указывает BP? Это на (или близко к) SP перед фрагментом кода выше?

Я предполагаю, что вы сбрасываете указатель стека таким образом, что ваш DAP поврежден использованием стека при вызове INT 13. e.g.:

1) Initial state:           2) After pushing DAP:

|  (stuff)  |               |  (stuff)  |
+-----------+ <-SP          +-----------+ <-BP?
             (== BP?)       |           |
                            |    DAP    |
                            |           |
                            +-----------+ <-SP


3) After mov sp, bp         4) INT 13 stack usage corrupts DAP:

|  (stuff)  |               |  (stuff)  |
+-----------+ <-SP?         +-----------+ SP
|           |               |XXXXXXXXXXX| | INT 13 uses stack 
|    DAP    |               |XXXXXXXXXXX| v
|           |               |corrupt DAP|
+-----------+ <-DS:SI       +-----------+
0 голосов
/ 19 июня 2010

Вы убедились, что расширения INT 13 поддерживаются?

MOV AH, 41H
MOV BX, 55AAH          
MOV DL, 80H                ; drive number
INT 13H
JC Unsupported
...