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
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
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:
- Data segment, Assembleur DOS
- App data - Guide
- Windows data recovery - Télécharger - Récupération de données
- Get data back - Télécharger - Récupération de données
- Easeus data recovery wizard - Télécharger - Récupération de données
- Power data recovery - Télécharger - Sauvegarde
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.
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.