2010-09-11 17 views
1

Je le code suivant:Assembleur mov question

mov ax,@data 
mov ds,ax 

Pourquoi je ne peux pas écrire comme ça?

mov ds,@data 

Toutes les sources:

.MODEL small 
    .STACK 100h 
    .DATA 
    HelloMessage DB 'Hello, world',13,10,'$' 
    .CODE 
    .startup 
    mov ax,@data 
    mov ds,ax 
    mov ah,9 
    mov dx,OFFSET HelloMessage 
    int 21h 
    mov ah,4ch 
    int 21h 
    END 

Merci!

Répondre

4

Vous ne pouvez pas, car le jeu d'instructions ne contient pas d'instruction pour le faire. C'est juste l'une des nombreuses idiosyncrasies du x86.

Ce type de restrictions est assez normal pour les langages d'assemblage. La plupart des architectures contiennent des registres traités spécialement (par exemple le mot d'état du processeur), mais généralement moins que l'architecture x86.

La raison de ne pas fournir une instruction pour tous les mouvements possibles est de réduire la taille de l'ensemble d'instructions, de sorte qu'une instruction consomme moins de mémoire. Dans l'ensemble, il est plus efficace de faire des mouvements qui sont rarement nécessaires en deux étapes.

+0

+1 Vous pouvez également dire que la raison pour laquelle vous ne pouvez pas modifier 'ds' avec l'une des instructions standard' mov' est que seulement 3 bits sont réservés pour encoder le registre de destination dans la plupart des instructions, et que ax, bx, cx, dx, si, di, sp, bp utilisent déjà toutes les possibilités disponibles. Mais cela simplifierait un peu les choses. –

+0

Oui, c'est la décision de conception concrète pour garder les instructions petites. – starblue

+0

Dans ce cas, où 'mov ds, ax' vient-il? Je suis sûr que c'est un 'mov' avec' ds' comme registre de destination;) Vous avez un argument sonore et je joue juste! – Lazarus

0

Je ne suis pas un expert mais voici comment je comprends que cette contrainte fonctionne. Les registres Segment servent à contrôler quel segment de mémoire est utilisé par les instructions du registre, de sorte que la dernière chose que vous voulez est de charger un registre de segment (DS dans ce cas qui est le registre de segment de données) à partir d'une mémoire emplacement. Le fait de modifier DS peut entraîner la modification de l'emplacement de mémoire pendant le processus de mise à jour DS, c'est-à-dire que les premiers bits/octets chargés dans DS le font pointer vers un autre segment avant la lecture du reste. Il est plus prudent de lire la valeur dans l'Accumulator (AX) ou dans un autre registre général, donc maintenant la valeur est dans le processeur lorsqu'il est chargé dans le registre de segment, donc aucune chance que la valeur soit corrompue pendant le chargement.

+1

Je ne pense pas que ce soit la raison, car DS pourrait facilement être mis à jour après la lecture de la valeur complète. – starblue

+0

Si c'était l'explication, il n'y aurait pas d'instruction comme 'mul ax ', parce que' ax' pourrait être "corrompu" au fur et à mesure qu'il se multiplie. –

+0

@starblue, il pourrait facilement être mis à jour de cette façon si le processeur a l'emplacement dans lequel lire la valeur avant de le charger dans DS (disons 'mov ax, @ Data' puis' mov ds, ax'). il suffit de charger la valeur dans le registre. Je ne dis pas que j'ai raison, je dis que ce n'est pas invraisemblable. – Lazarus

1

registre à usage général comme la « hache » est conçu pour maintenir le nombre de 16 bits pointant vers les données (dans votre cas la chaîne dans la DATA)

Donc, si vous essayez de passer directement les données à la spéciale enregistrer (ds ou segment de données ici) il ne fonctionnera pas correctement car il ne sait pas accepter les données de cette façon. Donc, nous obtenons d'abord ce «numéro» ou le point dans l'emplacement de la mémoire où les données commencent & passer ce point à ds registre.