IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

[EPROM] Adressage en mode réel


Sujet :

Assembleur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 172
    Points : 100
    Points
    100
    Par défaut [EPROM] Adressage en mode réel
    Salut,

    je suis en train de bosser sur un projet qui consiste à faire booter une carte à base de Pentium MMX. J'en suis au debut, je fais quelques prog de test pour me familiariser avec les outils. L'EPROM que je programme se situe à l'adresse E0000h (jusqu'à FFFFh) du plan mem de la carte.
    Puisque le pentium boot en FFFFh, je mets une instruction de saut à cette adresse pour pouvoir ecrire mon prog.
    Le problème c que je n'arrive pas à faire un saut de plus de 64Ko. Je suis qu'un segment ne peut faire que 64Ko, mais en changeant de segment je pensais qu'on pouvait adresser jusqu'à 1Mo. Je peux tres bien sauter à l'adresse F0000h avec l'instruction jmp 0xF000:0x0000 (donc en changeant de segment, mais si je vais plus loin, ça marche pas.

    Je suis en train de voir pour passer en mode protégé mais j'aimerais comprendre pourquoi je peux pas en mode réel.

    Merci d'avance

    Tom

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 80
    Points : 69
    Points
    69
    Par défaut Re: Adressage en mode réel
    Citation Envoyé par ruda.tom
    Salut,

    je suis en train de bosser sur un projet qui consiste à faire booter une carte à base de Pentium MMX. J'en suis au debut, je fais quelques prog de test pour me familiariser avec les outils. L'EPROM que je programme se situe à l'adresse E0000h (jusqu'à FFFFh) du plan mem de la carte.
    Puisque le pentium boot en FFFFh, je mets une instruction de saut à cette adresse pour pouvoir ecrire mon prog.
    Le problème c que je n'arrive pas à faire un saut de plus de 64Ko. Je suis qu'un segment ne peut faire que 64Ko, mais en changeant de segment je pensais qu'on pouvait adresser jusqu'à 1Mo. Je peux tres bien sauter à l'adresse F0000h avec l'instruction jmp 0xF000:0x0000 (donc en changeant de segment, mais si je vais plus loin, ça marche pas.

    Je suis en train de voir pour passer en mode protégé mais j'aimerais comprendre pourquoi je peux pas en mode réel.

    Merci d'avance

    Tom

    peu tu stp monter le bout de code dont tu parles ? ce sera peu être + évident de voir le pb ...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 172
    Points : 100
    Points
    100
    Par défaut
    en fait quand je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	.globl _debut
     
    	.org 0x1F000
     
    _debut : jmp _debut
     
    	.org 0x1FFF0 ; adresse de boot
     
    	ljmp $0xFF00,$0x0000 ;jump à l'adresse FF000h du plan mem soit 1F000h de l'EPROM : adresse faisant partie des 64Ko supérieur de l'EPROM
    ça marche
    et quand je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	.globl _debut
     
    	.org 0x1F000
     
    _debut : jmp _debut
     
    	.org 0x1FFF0 ; adresse de boot
     
             ljmp $0xEF00,$0x0000 ;jump à l'adresse EF000h du plan mem soit 0F000h de l'EPROM : adresse faisant partie des 64Ko inférieur de l'EPROM
    ça marche pas.

    Donc je n'arrive pas à faire un saut plus grand que 64Ko, alors que je change la valeur du segment.

    Rq:j'utilise la convention AT&T comme vous l'avez surement remarqué.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 172
    Points : 100
    Points
    100
    Par défaut
    petite rectification.
    le code qui marche pas c plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       .globl _debut 
     
       .org 0x0F000 
     
    _debut : jmp _debut 
     
       .org 0x1FFF0 ; adresse de boot 
     
             ljmp $0xEF00,$0x0000 ;jump à l'adresse EF000h du plan mem soit 0F000h de l'EPROM : adresse faisant partie des 64Ko inférieur de l'EPROM

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 80
    Points : 69
    Points
    69
    Par défaut
    j'le trouve bizarre ton code ....

    pourquoi tu fais ca ?:
    debut: jmp debut
    ton prog va boucler à l'infini sans rien faire ...


    pourquoi 2 org (différents en plus) ?

    le jmp ne doit pas être suffisant...il faut réinitaliser tes segments de données...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 172
    Points : 100
    Points
    100
    Par défaut
    la boucle infini c fait expres. C'est juste un test pour voir si je vais bien à l'adresse que je veux. Comme ça boucle à l'infini, après je peux regarder l'adresse (qui ne change pas) sur le microprocesseur.

    Pour les org, je sais que le pentium demarre à l'adresse FFFF0h (ce qui est également l'adresse de la fin de mon EPROM), donc il faut que je fasse un saut plus bas dans l'EPROM pour pouvoir écrire du code. Je mets donc un jmp à l'adresse FFFF0h (1FFF0h de l'EPROM). Voila pourquoi j'ai un 2eme org.

    Le premier me permet de dire où je veux commencer mon code.
    Et donc l'idéal est que je vienne au début de l'EPROM (qui est à l'adresse E0000h car elle fait 128Ko). Mais je n'arrive pas à aller en dessus des 64Ko.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    ljmp, c'est un jmp ptr16:16 ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 172
    Points : 100
    Points
    100
    Par défaut
    non, un jmp ptr16:32

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    ce que je ne comprends pas c'est comment tu fais pour tester que ton programme marche ou non, comment tu fais pour connaitre eip ? On pourrait peut être mettre des test en place. Par ailleur, je ne vois pas ou commencent et finissent tes segments, ton assembleur calcule comment les offsets ?

  10. #10
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    Bonjou, Je ne suis pas sûr de ce que j'écrit mais l'idée est là:
    Tu pourais faire un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
       .org 0x0000 
       _debut : jmp _debut 
     
       .globl _debut 
     
       .org 0x0F000 
       ljmp $0xE000,$0x0000
     
       .org 0x1FFF0 ; adresse de boot 
     
             ljmp $0xEF00,$0x0000
    ça fait 2 saut mais ça devrais marcher et puis une fois à l'adresse E0000h les 2 sauts pouront être écrasé: on en a plus besoin.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 172
    Points : 100
    Points
    100
    Par défaut
    ouai j'y ai pensé ça ne marche pas de faire 2 sauts. Mais j'avais pas exactement les memes sauts que toi mais c t dans le meme esprit je pense. J'essaierai ton prog. En fait là je peux pas car la carte est dasn mon école et je ne peux pas y accéder en ce moment (VACANCES !!! ).

    Pour répondre à Blustuff, pour tester, je regarde la valeur du bus d'adresse directement dur les pattes de l'EPROM qui me sert de BIOS. En fait c'est un carte que je dois démarrer, donc je ne peux pas me servir de la liaison série pour afficher des trucs à l'écran car c'est moi qui doit configurer la liaison série. Mais avant de pouvoir faire ça je dois d'abord parvenir à accéder au début de mon EPROM.

    Par contre je ne comprends pas trop ta question sur les offsets. En fait je suis pas un spécialiste en assembleur, je m'y suis remis depuis que j'ai ce projet, c'est a dire il y a pas tres longtemps. désolé

    Je sais pas si ça peut t'aider mais en fait mon EPROM fait 128Ko et le pentium demarre en haut du plan memoire (FFFF0h), c'est là que se trouve le haut de mon EPROM. Et moi je voudrais aller en bas de mon EPROM, mais je n'arrive pas à faire un saut de plus de 64Ko (meme en changeant de segment).

    dway m'a dit :
    le jmp ne doit pas être suffisant...il faut réinitaliser tes segments de données...
    le jmp ne va pas ecrire directement dans le CS ?
    sinon je fais ça avec un simple mov ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    si si, le jmp ptr16:32 va modifier cs, et c'est tout ce qui compte. Dans ton proigramme pour l'instant il n'y a nul besoin de ds. Aussi, mov cs, r/m32 n'existe pas. Tu peux désassembler le programme compilé ?

  13. #13
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    ouai j'y ai pensé ça ne marche pas de faire 2 sauts. Mais j'avais pas exactement les memes sauts que toi mais c t dans le meme esprit je pense.
    Si les 2 sauts ne marchent pas alors ça ne vient pas de l'instruction "ljmp" (sinon ya pas de raison que ça ne marche pas) et donc pas du saut de plus de 64 ko, c'est un autre problème.
    Es-tu sûr de pouvoir accèder à l'adresse voulue?

  14. #14
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 65
    Points : 105
    Points
    105
    Par défaut
    Hello ruda,

    Citation Envoyé par ruda.tom
    je suis en train de voir pour passer en mode protégé mais j'aimerais comprendre pourquoi je peux pas en mode réel.
    Il me semble qu'un long jump sur 6 octets (2 octets de sélecteur+4 octets d'offset) n'est possible qu'en mode protégé puisque qu'un sélecteur nexiste qu'en mode protégé pour pointer dans une GDT ou une LDT.

    Citation Envoyé par ruda.tom
    non, un jmp ptr16:32
    Je pense que ton compilos l'interprète bien comme un 16:16 puisque tu es en mode réel...


    Voici ce que je lis dans la doc Intel:


    After RESEST; address lines A[31-20] are automatically asserted for instruction fetches. This fact, together with the initial values of CS:IP causes instruction execution to begin at physical address FFFFFFF0h. Near (intrasegment) forms of control transfer instructions may be used to pass control to other addresses in the upper 64K bytes of the address space. The first far (intersegment) JMP or CALL instruction causes A[31-20] to drop low, and the 386 continues executing instructions in the lower megabyte of physical memory. This automatic assertion of address lines A[31:20] allows system designers to use a ROM at the high end of the adress space to initialize the system.
    Je ne vois pas exactement pourquoi mais j'ai l'intuition que cela explique ton problème (le fait qu'un jump near fonctionne et qu'un far ne fonctionne pas ...).


    golem
    +++

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    eh bien, il semblerait que l'adresse FFFFFFF0h, ne soit plus accessible après la première instructions qui change cs (puisque > 1 M) Ce qui expliquerait le désordre crée par le jump. Le truc serait de copier la ROM quelque part < 1M et de sauter sur ce quelque part non ? ou sinon, effectivement je n'ai pas tout compris.

  16. #16
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 65
    Points : 105
    Points
    105
    Par défaut
    Hello,

    Citation Envoyé par blustuff
    Le truc serait de copier la ROM quelque part < 1M et de sauter sur ce quelque part non ?
    L'idée est amusante mais j'ai un peu de mal avec le fait que les bits d'adresse hauts sont collés à 1, cela veut dire que si tu fais ta copie depuis la rom vers des adresses < 1M, la copie ne s'effectuera pas en dessous du meg mais décalé de +FFF00000, ce qui n'a pas de sens en mode réel hum.. Tu me suis ? Bon je suppose que le proc. est suffisamment smart pour ne pas faire ce genre de truc et copie effectivement en dessous du meg...


    Citation Envoyé par ruda.tom
    Pour les org, je sais que le pentium demarre à l'adresse FFFF0h (ce qui est également l'adresse de la fin de mon EPROM),
    Quand tu dis l'"adresse de la fin de mon EPROM", tu veux bien dire 16 octets avant la fin de ton EPROM, on est d'accord ?


    golem
    +++

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Aaah ok. En gros, sur 128k, on ne peut en utiliser que 64 pour le code si j'ai bien compris. Mais me trompe-je, encore en disant que tout l'espace < 1M n'est pas décalé mais seuelement le haut ?

Discussions similaires

  1. VESA - Mode réel / protégé / EMS-XMS
    Par zdra dans le forum x86 16-bits
    Réponses: 35
    Dernier message: 21/08/2010, 10h39
  2. Mode réel et protégé
    Par stephane543 dans le forum Assembleur
    Réponses: 5
    Dernier message: 24/04/2008, 13h30
  3. Mode réel de nos jours
    Par tixweb dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 21/06/2007, 14h15
  4. Compilateur C 16 bits mode réel
    Par jfg31 dans le forum C
    Réponses: 10
    Dernier message: 11/03/2006, 10h40
  5. [Débutant] Segmentation mode réel / mode protégé
    Par vivid dans le forum Assembleur
    Réponses: 14
    Dernier message: 21/02/2006, 19h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo