[nasm] écriture boot disquette et disque dur

Contenu du snippet

AVERTISSEMENT SURTOUT Y FAUT PAS L'éXECUTER !!!! Y a peut-être 1 chance sur 100 que ca marche mais ca peut endommager la zone de boot de votre ordinateur.

C justement pour ca que j'ai pas pu le tester ce code et j'aimerai savoir si d'après vous il marche ou comment le tester sans rien risquer (au pire j'irai le tester au lycée lol).

Merci d'avance j'espere avoir de l'aide !!!

Source / Exemple :


BITS 16			;Set code generation to 16 bit mode
ORG 0x0100		;Set code start address to 0100h

SEGMENT .text		;Main code segment

    jmp start	   ;saut au d?but du prog

;  --- Donn?s diverses  ---

    first     db 'Ins?rez une disquette et appuyez sur une touche...',13, 10, '$'
    msgErr    db 'Erreur pendant ?criture sur disquette...', 13, 10, '$'
    okay      db 'A fini correctement VIVE PRINCE DES SARDINES !!!', 13, 10, '$'
    floppybuf resb 512  ;tableau repr?sente secteur de disquette

;  --- Initialisation  ---

start:	           ;d?but du prog
    mov ax, cs
    mov ds, ax
    mov es, ax

;  ---  Ecrit message et attend l'appui d'une touche  ---

    ;?crit
    mov ah, 09h
    mov dx, first
    int 21h

    ;attend l'appui
    mov ax, 0C08h
    int 21h

;  ---  Copie secteur dans floppybuf  ---

    mov si, debut_Disquette
    mov di, floppybuf
    mov cx, 512
    rep movsb

;  ---  pour le compte des erreurs  ---

    xor ax, ax     ;on met ax a 0

;  ---  On copie le code de la disquette dans buffer  ---

copie_disquette:

    ;on met ax dans la pile
    push ax

    ;recalibre la disquette
    mov ah, 00h
    mov dl, 0           ;drive 0
    int 13h

    ;?crit le secteur
    mov ax, 0301h       ;1 secteur
    mov dx, 0           ;t?te et lecteur de disquette
    mov ch, 0           ;cylindre 0
    mov cl, 1           ;premier secteur de disquette
    mov bx, floppybuf   ;pointeur sur tableau
    int 13h

    ;si correct fin
    jc erreur
    mov ah, 09h
    mov dx, okay
    int 21h
    jmp fin

    ;si erreur
erreur:
    pop ax
    inc ax
    cmp ax, 5
    jl copie_disquette

    ;message d'erreur et fin du prog
    mov ah, 09h
    mov dx, msgErr
    int 21h
    jmp fin

;  ---  Termine le programme  ---

fin:
    mov ax, 4C00h
    int 21h

;  ---  Code ? copier sur une disquette  ---

    jmp debut_Disquette

    hardbuf   resb 512  ;tableau repr?sente secteur de disque dur

;  --- Initialisation  ---

debut_Disquette:
    mov ax, cs
    mov es, ax
    mov ds, ax

;  --- Affiche OK  ---

    mov ah, 0Eh
    mov al, 'O'
    mov bl, 4
    int 10h

    mov al, 'K'
    int 10h

;  --- Copie secteur dans hardbuf  ---

    mov si, debut_DisqueDur+7C00h
    mov di, hardbuf+7C00h
    mov cx, 512
    rep movsb

copie_disque_dur:

    ;on recalibre le disque dur
    mov ah, 00h
    mov dl, 80h    ;disque dur 1
    int 13h

    ;on ?crit le secteur
    mov ax, 0301             ;?crit un secteur
    mov ch, 0                ;cylindre 0
    mov cl, 1                ;secteur 1
    mov dh, 0                ;t?te 0
    mov dl, 80h              ;pour le disque dur
    mov bx, hardbuf+7C00h    ;pointeur sur tableau
    int 13h

    ;si pas d'erreur affiche K puis boucle infinie
    jnc bien

    ;si erreur
    jmp copie_disque_dur

    ;affiche ! pour signaler la r?ussite
bien:
    mov ah, 0Eh
    mov al, '!'
    mov bl, 4
    int 10h

    ;entame une boucle infinie (disquette)
boucle_floppy:
    jmp boucle_floppy

;  ---  Code ? copier sur le disque dur  ---

debut_DisqueDur:

    ;initialisations
    mov ax, cs
    mov ds, ax
    mov es, ax

    ;affiche une cha?ne de caract?res
    mov ah, 0Eh
    mov al, 'P'
    mov bl, 4
    int 10h

    mov al, 'r'
    int 10h
    mov al, 'i'
    int 10h
    mov al, 'n'
    int 10h
    mov al, 'c'
    int 10h
    mov al, 'e'
    int 10h
    mov al, '_'
    int 10h
    mov al, 'd'
    int 10h
    mov al, 'e'
    int 10h
    mov al, 's'
    int 10h
    mov al, '_'
    int 10h
    mov al, 's'
    int 10h
    mov al, 'a'
    int 10h
    mov al, 'r'
    int 10h
    mov al, 'd'
    int 10h
    mov al, 'i'
    int 10h
    mov al, 'n'
    int 10h
    mov al, 'e'
    int 10h
    mov al, 's'
    int 10h
    mov al, ' '
    int 10h
    mov al, 'C'
    int 10h
    mov al, 'O'
    int 10h
    mov al, 'R'
    int 10h
    mov al, 'P'
    int 10h
    mov al, 'O'
    int 10h
    mov al, 'R'
    int 10h
    mov al, 'A'
    int 10h
    mov al, 'T'
    int 10h
    mov al, 'I'
    int 10h
    mov al, 'O'
    int 10h
    mov al, 'N'
    int 10h

    ;boucle infinie
boucle_hard:
    jmp boucle_hard

;  ---  Fin du code disque dur  ---

Conclusion :


Alors voila maintenant hésitez pas à déposez vos commentaires mais soyez gentil je suis un noob de l'asm et le moin qu on puisse dire c que de toute facon l'optimisation c pas mon truc lol.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.