Problema com a implementação da função baseada em pilha 0x42 de int 0x13
-
28-09-2019 - |
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.
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