cs_henri12
Messages postés114Date d'inscriptionmercredi 25 février 2004StatutMembreDernière intervention 9 avril 2007
-
3 avril 2007 à 13:01
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 2016
-
5 avril 2007 à 17:21
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
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 3 avril 2007 à 13:38
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
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 3 avril 2007 à 14:41
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
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 3 avril 2007 à 15:04
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
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 3 avril 2007 à 15:27
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).
@++
Vous n’avez pas trouvé la réponse que vous recherchez ?
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 3 avril 2007 à 15:32
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
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 3 avril 2007 à 18:56
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:
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 5 avril 2007 à 17:21
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.