Demarrer MBR

Signaler
Messages postés
114
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
9 avril 2007
-
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
-
je demarre d une cle usb sous dos avant le lancement de la mbr du disque dur

je voudrais qu il lance la mbr de mon disque dur sans redemarrer 
 a l aide d un code asm  sous dos pour continuer a lancer le systeme d exploitation

es possible comment faire

merci

9 réponses

Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Ok, j'ai compris. Je pense qu'une solution serait de modifier le Ram du Cmos  et de faire un reset après avoir remplacé dasn cette ram la clef usb par la disque dur comme  périphérique de boot.
 En principe c'est à l'emplacement 2dh que cette information est renrégistrée.
 Pour lire un emplacement il faut faire : 

mov al,emplacement
 out 70h,al  ; séléctionne une adresse
nop     ;délai
nop
nop
 in al,71h ;lecture du contenu

et pour le modifier, remplacer le in al,71h par out al,71h
Il te faudra vérifier que dans ton cas c'est bien l'emplacement 2dh qui est utilisé donc
lire son contenu, aller dans le bios changer l'ordre du boot, relire 2dh et voir ce qui a changé. 
Je vais de ce pas tester sur mon PC cette procédure.
Bonne chance
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Cela fonctionne parfaitement, mais chez moi deux emplacements sont utilisés: 65 et 7C
Boot à partir du floppy, ils continnent respectivement  D0 et  68 et pour le disque C: , D2 et 6A.
 Voici comment j'ai procédé avec debug (commande A=assemble) toutes les lignes sont suivies d'un return
Mov di,200
mov cx,7f
xor bl,bl
mov al,bl
 out 70,al
nop
nop
nop
in al,71
stosb
inc bl
loop 108 
g116
rbx
0
rcx
200
nc:\cmos.com
w
q
Ensuite j'ai modifié l'ordre du boot  suivid'un reset
et quand je retrouve la main :
debug c:\cmos.com
a100
mov di,300
g116
c220 2ff 320 
( c'est à dire comparer les deux lectures en négligeant le RTC et le checksum)  
 Mon bios est un Phoenix Award
ps: sauf erreur ou omission 
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

l'int 13h avec dl,80h ne fonctionne pas ?
sinon:
si code de lancement dans la plage 0:7c00h - 0:7dffh alors copie du code a 0:600h puis jmp code de lancement
lecture du mbr disque à 0:7C00h par bios int 13h(dx=80h, cx=1, es=0, bx=7C00h, ax,201h)
initialisation des segments et registres. (es=ds=ss=fs=gs=ax=bx=cx=si=di=sp=bp=0, dx=80h).
jmp far 0:7C00h

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

un petit oubli, tu devras au préalable sauvegarder la table des vecteurs d'interruption du bios et la restaurer avant de sauter sur ton mbr disque.
(je pense que les vecteurs doivent toujours rester identiques d'un boot à l'autre mais verifie quand meme sinon, interdit l'option de copie du bios en ram peut etre).

@++
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Pour Patalo
J'ai essayer en chargeant le mbr en 0:7c00 et en sautant à cette adresse avec  segemnts à 0 : plantage. J'ai  préféré incriminer le bios et son environnement avant le boot et  bidoullier le cmos. Pourrais-tu expliciter "copie du code a 0:600h pui sjmpcode de lancement" ? 
Amicalement
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

le code de ton mbr usb est certainement chargé comme tout les mbr a l'adresse 0:7C00h.
si tu inscrit un autre mbr par dessus, le premier code va etre écrasé et c'est le plantage assuré au retour de l'interruption de chargement.
pour eviter ce problème, tu dois copier ton premier MBR à une adresse non utilisée, eventuellement juste après la table d'interruption (0:0 - 0:3FF) et le bloc de données BIOS (0:400 - 0:5FF) ce qui donne 0:600h. et sauter à l'adresse qui continue:

start:
  copie de (end-start) octets de start vers 0:600h
  jmp far 0:(600h+lancement-start)
lancement:
  lecture du mbr disque à 0:7C00h par bios int 13h(dx=80h, cx=1, es=0, bx=7C00h, ax,201h)
  initialisation des segments et registres. (es=ds=ss=fs=gs=ax=bx=cx=si=di=sp=bp=0, dx=80h). (voir doc sur les params donnés par le bios au mbr pour complément)
  jmp far 0:7C00h
end:

@++
@++

@++
Messages postés
114
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
9 avril 2007

auriez vous un code compiler que je peux essayer ou en asm pour debug

j ai compiler ce code il y a des erreurs

Mov di,200
mov cx,7f
xor bl,bl
mov al,bl
 out 70,al
nop
nop
nop
in al,71
stosb
inc bl
loop 108 
g116
rbx
0
rcx
200
nc:\cmos.com
w
q
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Ok. je vais creer une source et un module et je les placerai sur ce site en te prévenant une fois que ce sera fait ( un jour de delai).
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
salut
j'ai codé scmos.asm et je l'ai placé sur ce site .
 Indépendamment de l'usage que tu pourrais en faire, le fait de pouvoir sauver le setup et le recréer m’a paru intéressant
Je l'ai testé avec succès: 
Dans msdos chargé à partir d'un floppy:
scmos  floppy
Dans windows chargé à partir d'un disque dur:
scmos disque
Il suffit d'exécuter floppy pour démarrer à partir de la disquette et de même avec disque pour le faire à partir du disque.
Maintenant, il n'est pas possible de terminer le programme généré par un reset du genre int 19h, parce que Windows néglige cette interruption.
Il faut donc utiliser scmos dans un fichier batch avec le reset approprié du système.

.