Modification d'interruption au boot [Résolu]

Signaler
Messages postés
10
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
3 novembre 2007
-
Messages postés
10
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
3 novembre 2007
-
Bonjour, je me suis remis à l'assembleur (sous debug pour éviter les compilations) et j'ai modifié l'interruption 80h. Cela fonctionne très bien sous DOS lorsque mon programme est chargée à une adresse en 100h mais, après avoir fait "w cs:100 0 0 1" pour faire une disquette de boot, mon programme ne fonctionne pas. Après un peu de débogage, j'ai vu que l'erreur se produisait bien lors de l'appel à l'interruption. J'ai essayé avec 144h et 44h mais rien n'y fait.

Exemple de programme (fait sous Windows XP):

0CCE:0100 8CC8 MOV AX,CS
0CCE:0102 BB0000 MOV BX,0000
0CCE:0105 8EDB MOV DS,BX
0CCE:0107 A30202 MOV [0202],AX
0CCE:010A BB1501 MOV BX,0115
0CCE:010D 891E0002 MOV [0200],BX
0CCE:0111 CD80 INT 80
0CCE:0113 CD20 INT 20
0CCE:0115 B84109 MOV AX,0941
0CCE:0118 BB0F00 MOV BX,000F
0CCE:011B B90100 MOV CX,0001
0CCE:011E CD10 INT 10
0CCE:0120 B400 MOV AH,00
0CCE:0122 CD16 INT 16
0CCE:0124 CF IRET

-->

A
Fin normale du programme

Donc, pourriez-vous m'aider à gérer les interruptions au boot. Merci d'avance pour votre aide.

Au bon artisan, l'outil importe peu,
Yoha,

5 réponses

Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
7C00h est une adresse pas un segment !
C’est à 0000:7C00 que ton module sera chargé et exécuté par le BIOS avec CS=0Donc ton code sera:<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>







0000:7C00 8CC8           MOV     AX,CS
0000:7C02 BB0000         MOV     BX,0000
0000:7C05 8EDB           MOV     DS,BX
0000:7C07 A30202         MOV     [0202],AX
0000:7C0A BB1501         MOV     BX,115
0000:7C0D 891E0002       MOV     [0200],BX
0000:7C11 CD80           INT     80
0000:7C13 CD20           INT     20
0000:7C15 B84109         MOV     AX,0941
0000:7C18 BB0F00         MOV     BX,000F
0000:7C1B B90100         MOV     CX,0001
0000:7C1E CD10           INT     10
0000:7C20 B400           MOV     AH,00
0000:7C22 CD16           INT     16
0000:7C24 CF             IRET





Le nouveau vecteur de l’int 80 sera  0:115 alors qu’il doit être 0000:7C15 (et pas 7D15 comme je l’ai écrit par erreur.






 





 
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Pour Debug le secteur 0 est le premier secteur du DOS et ne permet pas d'accéder au premier secteur  physique d'un disque ou disquette
Il faut utiliser l'int 13h pour ce faire.
De plus le bios lit le secteur 0 (physique) de la disquette de boot en 0:7C00 et saute à cette adresse. Dans ton cas, l'int 80h va pointer sur 0:115  et c'est le contenu  de cette adresse qui va être exécuter c'est à dire n'importe quoi.
 Il faudra  donc  au moins remplacer 115 par 7d15 pour que ton programme fonctionne tel quel.
A ceci près que l'int 20h étant  une interruption Msdos et celui-ci n'étant pas encore chargé c'est aussi n'importe quoi qui sera effectué après IRET.

Amicalement.
Messages postés
10
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
3 novembre 2007

Pour l'interruption 20h, effectivement, je l'ai laissé pour les tests sous debug. En principe, je la remplace par un saut sur lui-même.

Le fait de faire:

0CCE:0100 8CC8 MOV AX,CS

puis:

0CCE:0107 A30202 MOV [0202],AX

ne me permet-il pas justement de donner le segment du code (7C00h) ? J'essaierais tout de même en remplaçant cette méthode générale par 7C00h.
Messages postés
10
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
3 novembre 2007

Mince, c'est sans doute ce qui me manquait... Dire que je n'avais pas vu ça ^^. Bon, je le teste et je dirais si cela fonctionne bel et bien. Merci en tout cas !
Messages postés
10
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
3 novembre 2007

Oui, c'était bien cela. Après quelques essais j'ai réussit à faire un programme qui affiche les lettres A, B puis C, B l'étant par une interruption. Merci beaucoup de m'avoir aidé ! Il faudra que je lise plus attentivement désormais ^^.