begin process at 2012 05 25 05:19:48
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Processeurs

 > 

X86

 > 

Logique d'utilisation du registre DS (mode réel)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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)

patatalo

Membre Club Administrateur CodeS-SourceS
salut,


De toute manière, en mode réel, tu n'as pas réellement de distinction entre les types de données. C'est réservé au mode protégé.

En mode réel, un segment aura toujours acces a sa valeur de base + 64ko.

Un .com est normalement limité a 64ko mais rien ne t'empêche d'allouer de la mémoire ou d'acceder a n'importe quelle zone en dessous des 1Mo.

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.

@++
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

Membre Club
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

Membre Club
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

Membre Club
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.

1 2

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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,616 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales