Data segment, Assembleur DOS

Fermé
biloute555 Messages postés 21 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 28 mai 2008 - 28 mai 2008 à 18:13
 avenging - 5 nov. 2008 à 19:20
Bonjour,

voila ca fais pas longtemps que je fais de l'assembleur, et ya une question que je me pose.
on commence toujours son programme en faisant
mov AX, @data
mov DS, AX

Ok, ça permet d'initialiser le data segment, jusque la tout va bien, mais ce que je me demande c'est pourquoi on doit le faire en 2 étapes? pourquoi ne peut - on pas faire:
mov DS, @data et c'est tout??

Merci de votre aide
A voir également:

1 réponse

Réponse trouvée sur ce site http://erci.no-ip.com/origine/static/pdf/asm.htm

Les deux lignes suivantes,

mov ax, data
mov ds, ax

servent à initialiser le registre DS. Celui-ci pointe vers le PSP au début du programme mais nous voulons le faire pointer vers notre segment de données appelé “data”. Cela est nécessaire puisque la fonction 9 de l’interruption 21h attend l’adresse de la chaîne dans le couple DS:DX et que notre message se trouve dans le segment de données.

La première instruction charge l’adresse du segment “data” dans AX. La seconde transfère cette valeur de AX dans DS. Mais pourquoi diable utiliser AX comme intermédiaire ? Après tout, on pourrait écrire :

mov ds, data

Eh bien non ! Pour la simple raison que DS est un registre de segment et qu’en tant que tel on ne peut pas lui charger de valeur immédiate.

On appelle « valeur immédiate » toute constante tapée directement dans l’instruction elle-même. Exemples de chargement de valeurs immédiates :

mov ax, 135 ;charge 135 dans AX
mov bx, offset message ;charge l’offset de message dans BX
mov bx, offset fin – offset debut ;charge le nombre d’octets entre fin et debut dans BX

mov es, 10 ;instruction illicite car ES est un registre de segment !Remarque : une autre possibilité aurait été d'écrire : “PUSH AX” (empiler AX) puis “POP DS”(dépiler le dernier nombre empilé et le placer dans DS).

Voila.
0