IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Lecture de secteurs sur un disque


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Points : 89
    Points
    89
    Par défaut Lecture de secteurs sur un disque
    Bonjour,

    Je viens de terminer un ensemble d'applications communicantes écrites en C++, en HTML, en Java, en V.B.A. (Excel) et en RealBasic, huit mois de travail.
    De coup je ne sais plus programmer en Assembleur ! Ou alors j'ai le cerveau qui flanche !
    Bref QU'EST-CE QUI NE VA PAS DANS CE CODE ? J'ai passé toute la matinée à faire des tests débiles pour rien.
    C'est trivial, il s'agit de lire des secteurs choisis sur un disque (qui n'est pas celui de lancement).

    Merci si quelqu'un à une idée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Salut,
    J'ai beau avoir fait de l'assembleur en 16 bits , ça date un peu.
    Dans quel système est-on ?.Windows 3.1,MsDos 5.5 ???? et avec quel machine,quel microprocesseur ?.
    mov ebx, tp
    mov [bx], dword 'TEST'
    Test est un mot réservé (c'est une instruction µp) non autorisé.
    Si "mov ebx,tp" correct, "mov [bx],tp" suspect
    "mov [ebx],dword ptr Machin" correct

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Points : 89
    Points
    89
    Par défaut je vais me mettre au tricot
    - La machine : PIV à 2,4 2 Go. etc.
    - Système : aucun, mais c'est NTLDR qui charge et lance ce bout de code
    - c'est du 16 bit parce que à ce moment là le processeur et encore en mode réel (ce qui du reste n'interdit formellement pas le 32 bits)
    - "test" est effectivement une instruction mais entre ' ' cela devient simplement une constante

    Le pire c'est que cela semble fonctionner (CF n'est pas mis après int 13), mon tampon (tp) dans lequel j'écris "TEST" est effacé MAIS pas avec le contenu de mon secteur !

    Merci des réponses.

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Re,
    mov ebx, tp
    mov [bx], dword 'TEST'
    Sauf erreur tp n'est pas défini , s'il ne fait que 2 bytes c'est bon , si + la suite est fausse

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Points : 89
    Points
    89
    Par défaut Trouvé cette nuit !
    En fait mon code fonctionnait, mais l'outil (EditHexa) que j'avais utilisé pour écrire mon secteur de test ne l'écrivait pas où je pensais !
    Attention donc si vous vous en servez le numéro de secteur apparaissant en bas n'est pas le LBA mais -apparemment ?- le numéro relatif au début de la partition ; et mon secteur 3 est en fait le 65 !

    Merci de votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire un secteur sur un disque/carte SD
    Par jphi5 dans le forum C#
    Réponses: 1
    Dernier message: 07/05/2007, 09h13
  2. Lecture / écriture d'objets sur le disque dur ?
    Par miria.vhg dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 06/02/2007, 15h21
  3. Réponses: 2
    Dernier message: 10/10/2006, 09h33
  4. Trouver les secteurs endommagés sur un disque dur.
    Par Michaël dans le forum Composants
    Réponses: 2
    Dernier message: 05/11/2005, 07h44
  5. Secteurs défectueux sur le disque dur ?
    Par berry dans le forum Administration système
    Réponses: 7
    Dernier message: 20/10/2005, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo