Nasm

Fermé
cs_henri12 Messages postés 114 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 9 avril 2007 - 3 avril 2007 à 23:02
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 12 avril 2007 à 23:50
salut
je viens de compiler ce mbr boot avec nasm

nasm -fbin aboot.asm -o binexe.exe

le programme c est bien compiler mais en lançant d une cle usb l image se fige
es un probleme d INT13

merci

; Auteur HwW_Mb Copyright 2005 .
; nom de fichier aboot.asm
; vous pouvez tout faire avec ce fichier :)
; Auto Boot v1.0 est un programme de secteur de démarrage qui charge un Boot !
; l'astuce est de Booter sur un autre drive depuis ce programme .
; le programme dois d'abors se charger dans notre adresse classique de démarrage 0000:7C00
; puis se déplacer lui même dans un autre segment 0100:0000 sinon impossible d'ecraser
; la mémoire et démarrer le Boot à charger :)
; les nouvelles versions de ce programme serons plus Cool que cela ! charger une partition
; par exemple :)
; faut démarrer avec le programme pour essayer :p  .
; pour les neuneus editer vos pramaitres de démarrage :) par exemple Boot.ini ajoutez la ligne
; suivante : C:\aboot.bin="Auto Boot v1.0" où C:\ est votre partition de démmarge qui contient
; sur sa racine le fichier executable aboot.bin .
; pour plus de précision contactez moi : [mailto:Clubeutelsat@yahoo.fr Clubeutelsat@yahoo.fr]
; ou nous joindres dans IRC serveur : irc1.heliosnet.org/6667 Channel : #AutoBoot .
; Bonne utilisation !


[BITS 16]                   ;et oui un programme 16 Bit ^^


StartCalcule:               ;début de l'offset


[ORG 0x00]                  ;pas d'offset à appliquer .


startcmp:  cmp word ax,0xFFFF ;on teste c le segment est déja plein par le programme :)
           jne start        ;on saute si déja charger en 0x100 (donc le nouveau segment)


Org100:    mov ax,0x100     ;on regle les registres de segments la nouvelle adresse est 0x100
           mov ds,ax
           mov es,ax
           mov ax,0x8000    ;pile en 0x8000 
           mov ss,ax
           mov sp, 0xf000   ;pointeur de pile en 0xf000


           jmp Progset      ;on saut vers le début du programme


Print:     push ax          ;on empile les registres :)
           push bx 
           push si
           cld              ;lecture => positive            
 
.next:     lodsb            ;Charge l'adresse String de SI dans al 
           or al,al         ;fin de la chaines !
           jz .end          ;alors on quitte :) 
           mov ah, 0x0e     ;on affiche le char :) 
           mov bl,0007h     ;couleur blanche
           int 10h          ;on écrit un char dans l'ecran
           jmp .next        ;pas encore terminée ? alors faut continuer      


.end:      pop  si          ;et OP pop :)
           pop  bx
           pop  ax
           ret              ;return :p


Boot:      mov si,msgSucc   ;sinon un message de succe .
           Call Print
           push es          ;fonction de Boot qui va charger le secteur du matielle à démarrer .
           xor ax,ax        ;on charge en 0000:xxxx
           mov es,ax
           mov ax,0x0201    ;on lit un lecteur
           mov cx,0x0001    ;secteur One .
           mov bx,0x7C00    ;et Offset 0x7C00 ! adresse de Boot 0000:7C00
           int 0x13         ;on le fait 2 fois
           int 0x13
           pop es           ;restaure ES sinon panic .
           jc .Error        ;si erreur on sautera vers le bad message
           jmp 0000:0x7C00  ;et on démarre le programme de la MBR à charger .


.Error:    mov si,msgError  ;on affiche le message d'erreur et on return
           Call Print
           jmp startke


start:     mov ax,0x07C0   ;ici c le vrai adresse du programme au démarrage .
    mov ds,ax
    mov es,ax
    mov ax,0x8000
    mov ss,ax
    mov sp, 0xf000
           mov cx,FindeCalcule - StartCalcule  ;on calcule la taille du programme ..
           push es
           mov di,-2       ;décalage de Byte donc 2 - 4 = -2 (Adressage)
           mov ax,0x100    ;copiage du programme de 0x000:0X7C00 à 0x100:0x0000
           mov es,ax
           mov si,Org100
           rep movsb       ;copiage !
           pop es
           mov ax, 0xFFFF  ;indique que le programme est déja copié c'est comme un pointeur .
           jmp 0x100:0000  ;on saut vers le nouveau segment .


Progset:


startke:   mov si,msgboot  ;on affiche un message à l'ecran
    call Print
          
prevar:    xor ax,ax       ;on lit l'option ..
           int 0x16
           cmp al,'1'
           je BootF1
           cmp al,'2'
           je BootF2
           cmp al,'3'
           je BootH1
           cmp al,'4'
           je BootH2
           jmp prevar


BootF1:    mov dx,0x0000   ;un select case tout con :p
           jmp Boot


BootF2:    mov dx,0x0001
           jmp Boot


BootH1:    mov dx,0x0080
           jmp Boot


BootH2:    mov dx,0x0081
           jmp Boot




msgSucc db 13,10,'Booting ...',13,10,0


msgError db 13,10,'Error Booting with Drive ..',13,10,0


msgboot db 13,10,'Auto Boot v1.0 Copyright 2005 Coded By HwW_Mb',13,10,'Chose Your Boot (1:Floppy Disk1, 2:Floppy Disk2, 3:Hard Disk1, 4:Hard Disk2)',13,10,0


times 510-($-$$) db 0x90   ;Nop !! jusqu'à 510 !


SignatureMBR dw 0xAA55     ;notre Signature d'un secteur de Boot !


FindeCalcule:

1 réponse

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
12 avril 2007 à 23:50
salut,
c'est une question çà?
http://www.asmfr.com/reglement.aspx
clos
0
Rejoignez-nous