1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| format binary
use16
; ce code est chargé par 'ntldr' en 0D00:0000
org 0xD000
disque db 0x81 ; second maitre
mess_1 db 'erreur disque',13,10,0
affiche_chaine:
lodsb
test al, al
jz @f
mov ah, 0x0E
mov bx, 7
int 0x10
jmp affiche_chaine
@@: ret
repeat 0x0D256 - $
db 1
end repeat
; init procedure - ntldr saute ici
depart:
; cs=es=0D00, ds=07C0, ss=0
; esi=edi=ebp=0, esp=7C00
xor eax, eax
mov ds, ax ; segment des données à 0
mov es, ax ; segment d'extra (fs gs)
mov ss, ax ; segment de la pile
mov esp, 0xFFFE ; valeur de la pile 0000:FFFE
cld
sti
mov ah, 0
mov dl, [disque]
int 13h
jc erreur
mov ebx, tp
mov [bx], dword 'TEST'
mov [bx+4], byte 32
mov [bx+5], byte '0'
mov [bx+6], byte '3'
mov [bx+7], byte 13
mov [bx+8], byte 10
mov [bx+9], byte 0
mov esi, tp
call affiche_chaine ; controle le tampon avant lecture
mov esi, dap
mov [esi], byte 16 ; lg structure
mov [esi+1], byte 0
mov [esi+2], byte 1 ; nbr. secteur à lire
mov [esi+3], byte 0
; mov eax, tp
; mov [esi+4], al
; mov [esi+5], ah
; shr eax, 16
; mov [esi+6], al
; mov [esi+7], ah ; segment:offset
; OU
; mov [esi+4], byte 0
; mov [esi+5], byte 0 ; segment
; mov [esi+6], byte 0
; mov [esi+7], byte 0xEC ; offset
; OU
mov eax, tp
mov [esi+4], eax
mov [esi+8], byte 3 ; premier secteur à lire
mov [esi+9], byte 0
mov [esi+10], byte 0
mov [esi+11], byte 0
mov [esi+12], byte 0
mov [esi+13], byte 0
mov [esi+14], byte 0
mov [esi+15], byte 0
mov ax, 0x4200
mov dl, [disque]
int 0x13
jc erreur
mov esi, tp ; voir le tampon aprés lecture
jmp fin
erreur:
mov esi, mess_2
fin:
call affiche_chaine
jmp $
dap db '1234567890123456',0,0
repeat 0xF000 - $ - 1024
db 2
end repeat
tp: repeat 1024 ; en EC00
db 3
end repeat ; en F000
; 16 secteurs de long |
Partager