Pergunta

Estou tentando uma nova abordagem para int 0x13 (apenas para saber mais sobre a maneira como o sistema funciona): usando a pilha para criar um DAP.

Supondo que o DL contenha o número do disco, o AX contém o endereço da entrada inicializável no PT, o DS é atualizado para o segmento certo e a pilha é definida corretamente, este é o código:

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

Como você pode ver: eu pressiono a estrutura DAP para a pilha, atualize o DS: SI para apontá -la, o DL já está definido, depois defina o AX para 0x42 e ligue para int 0x13

O resultado é o erro 0x01 em AH e obviamente o conjunto de CF. Nenhum setores é transferido. Eu verifiquei o rastreamento da pilha sem parar e tudo bem, a tabela de partição também está bem .. Não consigo descobrir o que estou perdendo ...

Esta é a parte da pilha de rastreamento do pacote de endereço de disco:

   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)

Estou usando a versão mais recente do QEMU e tentando ler no disco rígido (0x80), também tentei com um alinhamento 4bytes para a estrutura com o mesmo resultado (cf 1 ah 0x01), as extensões estão presentes.

Foi útil?

Solução

O que é mov sp, bp Fazendo - onde o BP aponta? Está em (ou perto de) SP antes do fragmento de código acima?

Meu palpite é que você está redefinindo o ponteiro da pilha de tal maneira que seu DAP está sendo corrompido pelo uso da pilha da chamada INT 13. por exemplo:

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       +-----------+

Outras dicas

Você garantiu que o INT 13 extensões fossem suportadas?

MOV AH, 41H
MOV BX, 55AAH          
MOV DL, 80H                ; drive number
INT 13H
JC Unsupported
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top