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

x86 32-bits / 64-bits Assembleur Discussion :

[Débutant] Mode réel et mode protégé


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier

    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 55
    Points : 111
    Points
    111
    Par défaut [Débutant] Mode réel et mode protégé
    Bonjour,
    Apprenant l'assembleur j'ai beaucoup de questions le concernant:
    J'ai lu que les processeurs demarrent tous en mode normal et qu'un programme en mode normal ne peut appélé une fonction en mode protegé mais qu'un programme en mode protégé peut faire appel à une fonction en mode normal. J'aimerais savoir comment definir le mode d'un programme ?
    Je sais que pour mettre une valeur dans un régistre on fait par exemple mov eax,14 mais si je veux créer un programme qui met un nombre dans un régistre et l'affiche comment m'y prendre j'ai éssayé divers technique comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    section .data
    db nbr
    section .text
    global _start:
    mov eax,4
    mov ebx,1
    mov ecx,[nbr]
    mov edx,t_nbr
    int 80h
    ;-------------------
    mov eax,1
    mov ebx,0
    int 80h
    et d'autres accrobatie mais rien ne marche. Besoin d'aide svp
    Merci par avance

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Citation Envoyé par cirediallo93 Voir le message
    J'ai lu que les processeurs demarrent tous en mode normal et qu'un programme en mode normal ne peut appélé une fonction en mode protégé mais qu'un programme en mode protégé peut faire appel à une fonction en mode normal. J'aimerais savoir comment definir le mode d'un programme ?
    Cela est un peu faux , c'est vrai pour le X86 néanmoins.
    La question est un peu étrange sachant que ton code est fait pour tourner sous Linux et donc ton programme est exécuter en mode proteger (que tu pourra pas changer).

    Citation Envoyé par cirediallo93 Voir le message
    Je sais que pour mettre une valeur dans un régistre on fait par exemple mov eax,14 mais si je veux créer un programme qui met un nombre dans un régistre et l'affiche comment m'y prendre j'ai éssayé divers technique comme:
    Méthode la plus simple c'est de faire appel a la fonction printf.
    Si tu veux afficher le nombre d'un registre , cela n'a rien n'a voir avec l'assembleur (t'aurais le même souci en C si tu ne peux pas utiliser printf et ces dérivé).
    C'est un probleme d'algorithme tu dois faire un calcul (des divisions par 10) pour afficher les bon caractère (les chiffre sont des caractères) correspondant au nombre de ton registre.

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 563
    Points : 43 465
    Points
    43 465
    Par défaut
    rien ne marche est un peu léger.

    Comment génères tu le code executable ?

    comprends-tu le code que tu as mis en annexe ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Membre régulier

    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 55
    Points : 111
    Points
    111
    Par défaut
    C'est un probleme d'algorithme tu dois faire un calcul (des divisions par 10) pour afficher les bon caractère (les chiffre sont des caractères) correspondant au nombre de ton registre.
    Des divisions par 10 ?

  5. #5
    Membre régulier

    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 55
    Points : 111
    Points
    111
    Par défaut
    C'est un exemple de programme que j'ai écris comment faire pour solutionner mon problème puisque je suis complètement bloqué

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Déjà en C (si tu sais programmer sur ce langage) comment fait tu pour afficher une variable , mais sans faire de %d ? (on gros avec printf("%s\n,str); t'arriverait a afficher tes variable ?

    Oui faut réfléchir un peu si t'as la valeur 4503 , c'est le caractère 4,5,0 et 3 , donc si t'as 4503 tu dois afficher les caractères que j'ai dit et pour ça ben algo c'est 4000/1000 , 500/100 ,0/10 et 3/1

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 563
    Points : 43 465
    Points
    43 465
    Par défaut
    Le noyau Linux fonctionne en mode protégé mais ça n'a pas d'importance pour ce que tu compte faire. La fonction système que tu utilises attend une chaine de caractère (son adresse devant être contenu dans ecx, et sa longueur devant être contenu dans edx), pas un nombre stocké dans un registre. Il te faut donc créer une routine qui convertisse cette valeur en chaine.

    C'est ce que Kannagi t'as expliqué.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  8. #8
    Membre régulier

    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 55
    Points : 111
    Points
    111
    Par défaut
    @Kannagi je connais le C mais vu que je débute en assembleur je me perds beaucoup puisque c'est encore beaucoup plus technique. Cependant j'ai éssayé avec print mais le programme ne fait tjrs rien

  9. #9
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 168
    Points
    10 168
    Par défaut
    Oui mais ton probleme n'a rien n'a voir avec l'assembleur et donc c'est un probleme d'algorithme , pour ça que si tu n'arrive pas a le faire en C , je vois pas pourquoi tu y arriverais en asm (dans le sens ou tu ne maitrise pas encore le langage)

    Bref en gros personne te fera ton code ou réfléchir a ta place ,néanmoins tu peux faire l'algo en asm ou en pseudo code ou en C pour qu'on puisse le corriger.

    Cependant j'ai éssayé avec print mais le programme ne fait tjrs rien
    Tu espere qu'on t'aide avec si peu d'information ?

  10. #10
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    déja on ne parle jamais du mode "normal" mais du mode "réel" (toutes les docs l'appellent comme ça) il y as 2 ou trois mode de fonctionnement pricipaux (réel, protégé, et long uniquement pour les processeur x86-64) mais dans ton cas ça ne sert a rien de savoir dans quel mode ton processeur fonctionne

    pour ce qui est de ton problème d'affichage de contenue du registre il faut que tu transforme ton registre en chaine de caractère et ensuite tu l'affiche avec "print" pour faire ça tu doit diviser succesivement le nombre avec l'instruction "DIV" pour extraire chaque décimal et mettre tout ça (dans le bon ordre) dans une chaine de caractère

    c'est un bon exercice pour debuter en assembleur, on pourrait te donner directement le code mais ça ne t'aiderait pas a progresser, par contre n'hésite pas a mettre ici ton code pour que l'on te le corrige


    ps: pour transformer un chiffre (0 à 9) dans un registre 8bits en un caractère ascii, il faut tout simplement lui ajouter 48 ( la valeur ascii du 0)

  11. #11
    Membre régulier

    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 55
    Points : 111
    Points
    111
    Par défaut
    Merci pour vos réponses mais j'ai tjrs quelques soucis de comprehension. Lorsque nous faisons une division (div) cela se passe entre eax et edx et on dit que le resultat sera stocké dans eax et le reste dans edx, donc si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov eax,54 (nombre que j'veux afficher)
    mov edx,10 (le diviseur comme vous l'avez dit de faire une division)
    div edx
    le registre contiendra 5 et edx contiendra le 4.
    Et mettre ça dans une chaine dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    section .data 
    db nombre ;retourne une erreur
    nombre: db resb ? ;retourne aussi une erreur
    donc je ne sais vraiment pas comment l'afficher en plus j'ai trouver une astuce disant qu'on peut afficher le contenu d'un registre en faisant print str$ (registre) mais lorsque je fais ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    section .text
    global _start
    _start:
    mov eax,78 ;(nombre à afficher)
    print str$ (eax)
    int 80h
    ;________
    mov eax,1
    mov ebx,0
    int 80h
    il sort error:parser: instruction expected
    Au cas où cela peut avoir une importance je fais de l'assembleur x86 pour NASM

  12. #12
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 563
    Points : 43 465
    Points
    43 465
    Par défaut
    Pour commencer, db réserve 1 octet. Si tu veux afficher el contenu d'un registre 32 bits, il te faut réserver 8octets
    voire
    resb permet de réserver de la RAM dans le segment .bss, si tu ne sais pas ce que c'est pour le moment, ne l'utilise pas.
    avec le même principe suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    resb 1 ; réservation 1 octet
    resb 2 ; réservation 2 octets
    resw 1 ; réservation de 1 mot soit 2 octes, équivalent à resb 2
    La ligne 6, ne veut rien dire d'où le parse error
    ligne 5, tu appelles la fonction gettimeofday (et plus sans mettre les bonnes valeurs dans ebx et ecx), je pense que c'est parce que tu ne comprends pas.

    Essayes déjà de faire un Hello Word qui fonctionne, puis ensuite travaille sur la routine de conversion entier chaine de caractères.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  13. #13
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    pour la compréhension du fonctionnement de la fonction DIV tu fait erreur, div divise un nombre de 64 bits lorsque que le diviseur est en 32 bits, les bits de poid fort en edx et les bits de poid faible en eax,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mov eax,54
    xor edx,edx ;fait un ou exclusif, méthode plus rapide pour mettre a zéro un registre (ici edx)
    mov ecx,10
    div ecx
    mais tu as bien comprit que le quotient est stocké dans eax et le reste dans edx

  14. #14
    Membre régulier

    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 55
    Points : 111
    Points
    111
    Par défaut
    J'ai lu des tas de cours assembleur mais je vois que c'est toujous compliqué pour moi pouvez-vous me dire les differentes étapes à suivre pour arriver à terme de cet exercice
    Ce qui chiffonne encore plus c'est qu'il n'y a pas un tuto standard pour l'assembleur

  15. #15
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 563
    Points : 43 465
    Points
    43 465
    Par défaut
    déjà répondu :

    Essayes déjà de faire un Hello Word qui fonctionne, puis ensuite travaille sur la routine de conversion entier chaine de caractères.
    T'arrives à faire un hello world ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  16. #16
    Membre régulier

    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 55
    Points : 111
    Points
    111
    Par défaut
    Bien-sûr mais ce que je me demande le nombre que je dois stocker dans le régistre je le met dans une variable puis je l'affecte au régistre avec ou je le mets directement dans le registre avec par exemple

  17. #17
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 563
    Points : 43 465
    Points
    43 465
    Par défaut
    Les deux sont faisable, Tu mets dans une variable situ as besoin d'utiliser plusieurs fois.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

+ Répondre à la discussion
Cette discussion est résolue.

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. [WD10] Combo Mode Test et Mode réel
    Par mogwai162 dans le forum WinDev
    Réponses: 8
    Dernier message: 24/08/2009, 16h14
  3. Mode réel et protégé
    Par stephane543 dans le forum Assembleur
    Réponses: 5
    Dernier message: 24/04/2008, 13h30
  4. Interprétation du sélecteur en mode réel et protégé 16 bits
    Par sebatlante dans le forum x86 16-bits
    Réponses: 0
    Dernier message: 23/04/2008, 19h08
  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