Accueil > Forum > > > > Logique d'utilisation du registre DS (mode réel)
Logique d'utilisation du registre DS (mode réel)
vendredi 19 mars 2010 à 16:28:39 |
Logique d'utilisation du registre DS (mode réel)

powel42
|
Bonjour à tous,
je suis curieux de savoir quelle est la "bonne" manière d'utiliser le segment DS (s'il y en a une).
Lorsque l'on démarre sous DOS 16 bits donc en mode réel un programme assembleur .COM, le registre DS (ainsi que ES, SS) ont la même valeur que CS
Je trouve ça pas normal étant donné qu'il faut systématiquement donner une autre valeur à DS que celle qui est donnée par défaut pour éviter d'écrire des données dans le code.
Et d'ailleurs ES aurai pu être initialisé pour pointer après la pile. Ainsi on aurai des données statiques dans DS et des données "dynamiques" pour les gros blocs de mémoire dans le tas après la pile.
Alors quelle est la bonne méthode ?
faire pointer DS après la pile ?
mov dx, ss
add dx, 4096
mov ds, dx
ou bien faire pointer DS juste après le code, par exemple si le code fait 1024 octets :
mov dx, cs
add dx, 64
mov ds, dx
Merci pour vos éclaircissements.
|
|
vendredi 19 mars 2010 à 22:05:41 |
Re : Logique d'utilisation du registre DS (mode réel)

ghuysmans99
|
Je pense que tu te trompes : un .COM ne peut excéder 64Kio (adressage max. pour un registre 16 bits). Donc tu ne risques pas d'écraser ton code si tu fais :
Code : org 0x100
[...]
mov word [ds:mavariable],0x12FF
[...]
int 0x20
mavariable dw 0
---
VB.NET is good ... VB6 is better 
|
|
samedi 20 mars 2010 à 03:12:16 |
Re : Logique d'utilisation du registre DS (mode réel)
|
samedi 20 mars 2010 à 17:29:25 |
Re : Logique d'utilisation du registre DS (mode réel)

powel42
|
Merci pour vos réponses,
en gros si j'ai bien compris, un fichier .COM a été concû pour travailler code et données dans un segment de 64 K.
Autrement dit les registres CS, DS, ES, SS n'existaient peut être pas lorsque la norme .COM a été mis au point.
C'est lors de l'apparition du .EXE que les registres CS, DS, ES et SS ont pris tous leurs sens ?
|
|
samedi 20 mars 2010 à 23:13:49 |
Re : Logique d'utilisation du registre DS (mode réel)

ghuysmans99
|
Les registres de segment existaient déjà et existe encore, mais il n'était pas nécessaire de les modifier. Si tu voulais faire un programme de plus de 64Kio, il te suffisait de faire un .EXE mais il valait alors mieux de le coder en un langage de plus haut niveau comme C ou Pascal.
---
VB.NET is good ... VB6 is better 
|
|
dimanche 21 mars 2010 à 00:12:32 |
Re : Logique d'utilisation du registre DS (mode réel)

powel42
|
Alors si ces registres existaient déjà ... c'est qu'ils sont là pour qu'on les changes à notre guise !
Il est plus dangereux de changer tes registres de segment que de les laisser CS=DS=ES=SS car tu pourrait ecraser les données des autres programmes ou du DOS plutôt que celles de ton propre programme. Le résultat pourrait être catastrophique.
C'est dangereux mais c'est fait pour ... si j'ai envie de copier une image dans la video RAM
C'est bien pratique de faire pointer DS:SI sur mon image en mémoire et faire pointer ES:DI sur un endroit de la video RAM
avec un REP MOVSB ça va tout seul
Donc ficher .COM ou pas ... il est "normal" de changer ces registres.
Maintenant j'en reviens à ma question du début du topic ... pourquoi en fait quand on démarre un fichier .COM on a CS=DS=ES=SS bêtement alors qu'il est évident qu'on ne va pas garder ces valeurs au long de notre programme ... d'ailleurs les vieux programmes DOS dont j'ai regardé le début ; ils changent systématiquement DS, ES et voir SS
ghuysmans99, tu m'a donné un exemple où tu utilise "org" pour signaler à l'assembleur d'où tu veux que ton programme commence pour effectivement pouvoir placer tes variables avant. Mais ça ne peut fonctionner que s'il y a une entête (exe header par exemple). Mais un fichier .COM pure, le programme est chargé systèmatiquement à partir du 257 ème octet du segment CS car les 256 premiers octets sont réservés au PSP.
Donc pas de possiblitée de placer des variables avant le programme, on est forcément obliger de les placer après ... et donc ma question : avant la pile ou après la pile ?
Donc si quelqu'un connait une logique connue dans l'affectation de DS ...
|
|
dimanche 21 mars 2010 à 11:36:48 |
Re : Logique d'utilisation du registre DS (mode réel)

ghuysmans99
|
Réponse acceptée !
Un programme .COM est toujours organisé comme ceci : PSP (256 octets) / CODE / DATA / STACK. Si tu ne dois pas tout le temps accéder à la mémoire vidéo, fais-toi quelques fonctions qui y accéderont et rendront la main avec la même valeur dans les registres de segment que lors de leur appel. Exemple (devrait fonctionner) :
Code : effaceEcran:
push es
push di
push cx
mov ax,0xB800
mov es,ax
xor di,di
xor ax,ax
mov cx,80*25
rep stosw
pop cx
pop di
pop es
ret
---
VB.NET is good ... VB6 is better 
|
|
dimanche 21 mars 2010 à 15:33:58 |
Re : Logique d'utilisation du registre DS (mode réel)

powel42
|
Voilà qui me semble plus familier, c'est à peu près ce que je fais sauf que je ne sauvegarde pas systématiquement ES, DI selon l'enchainement des appels fonctions.
PSP (256 octets) / CODE / DATA / STACK
Alors justement si j'ai ouvert ce topic c'est pour placer le segment DS au début de "DATA".
Histoire de ne plus me préoccuper de l'emplacement des données et de pouvoir écrire des choses genre :
mov byte ptr [0], variable0
mov byte ptr [1], variable1
mov word ptr [2], variable2
mov word ptr [4], variable3
...
...
etc ...
Alors y'a-t-il un moyen "standard" pour un executable .COM de connaitre son adresse de fin ; à partir de laquelle je pourrai définir DS ?
Merci.
|
|
dimanche 21 mars 2010 à 16:51:53 |
Re : Logique d'utilisation du registre DS (mode réel)

ghuysmans99
|
Vu qu'un .COM ne dépasse jamais 64Kio, tu fais simplement : mov ax,word [DS:tavariable]. Si c'est un tableau de mots, tu fais : mov ax,word [DS:tavariable+index*2]. Je ne vois pas où est ton problème !
---
VB.NET is good ... VB6 is better 
|
|
dimanche 21 mars 2010 à 22:20:44 |
Re : Logique d'utilisation du registre DS (mode réel)

powel42
|
J'aurai du être plus précis ; j'utilise DEBUG et l'assembleur du borland Pascal donc j'écris plutôt :
mov word ptr [2], 2000
..
..
..
inc word ptr [2]
..
..
..
jamais un nom de variable.
Quels assembleurs 8086 / 8088 je peux trouver produisant un .COM sans entête, ne rajoutant pas ni optmisant de code à ma place ?
Merci.
|
|
Cette discussion est classée dans : mov, ds, registre, mode, dx
Répondre à ce message
Sujets en rapport avec ce message
Simple addition [ par nostra ]
Big totoJe n'arrive pas à afficher les valeurs A (=3) et B(=2) ainsi que le résultat de l'addition. Merci de trouver le ou les erreurs commises.;-----
Addition pourtant simple [ par nostra ]
Big totoJe n'arrive pas à afficher le résultat de l'addition malgré les remarques de Nemesis. Merci de trouver le ou les erreurs commises. ;----------
petit probleme de debutant [ par freekc ]
j'essaie de faire un ptit prog que lorsque l'on rentre son nom prenom etc . Il y est un recapitulatif qui se mette en dessous ms lorsque que le recapi
loader problème de code [ par TRAX44 ]
salut tout le monde !!g essayer de faire un loader (petit prog qui charge un autre prog) mais c un desartre je comprend pas très bien ce qui ne marche
Ennoncés à corriger svp :-) [ par did2604 ]
Bonjour à tous,Mon professeur m'a demandé de convertir les énoncés (en langage C) suivants en assembleur, quelqu'un aurait-il la gentilesse de me les
rs232 [ par TRAX44 ]
salut,tout premièrement je sais qu'il ya des exemples sur le site!mais mon problème est autre je tiens à comprendre pourquoi mon code ne fonctionne pa
Multiplication de deux nombres compris entre 0 et 99 en assembleur [ par petitspirou ]
salut, j'ai un programme a faire mais je suis nul en assembleur, voici ce que j'ai fais mais ca ne fonctionne pas.Quelqun peut'il me le corriger et me
Recuperer le mode Video [ par FearBlue ]
Slt a tous !!!!!!!Je souhaite recupérer le mode video g lus dans une doc ca :Cette fonction retourne le numéro de code du mode vidéo en cours et tient
[NASM] TSR [ par sirozz ]
Slt à tous,voila, j'essaye de capturer les événements clavier grâce à l'interruption 09h et un programme TSR, j'ai essayé sur 2000, sur XP et j'ai tél
Charger un noyau [ par Stormy ]
Je voudrais charger le deuxième segment d'une disquette pour lancer un noyau OS rudimentaire. Sur le premier segment, j'inscris donc le code de charge
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|